Есть ли способ скомпилировать приложение python в статический двоичный файл?
То, что я пытаюсь сделать, это отправить мой код на удаленный сервер, который может иметь другую версию python и/или может не иметь пакетов, требуемых моим приложением.
Прямо сейчас, чтобы добиться такой переносимости, мне нужно создать перемещаемый virtualenv с помощью интерпретатора и кода. У этого подхода есть некоторые проблемы (например, вам нужно вручную скопировать кучу библиотек в ваш virtualenv, так как --always-copy
работает не так, как ожидалось) и обычно медленнее.
Там (теоретически) путь для создания самого python статически.
Интересно, могу ли я упаковать интерпретатор с моим кодом в один двоичный файл и запустить мое приложение в качестве модуля. Что-то вроде этого: ./mypython -m myapp run
или ./mypython -m gunicorn -c ./gunicorn.conf myapp.wsgi:application
.
Ответы
Ответ 1
Есть два способа решить вашу проблему.
- Используйте статический построитель, например, замораживание или pyinstaller, или py2exe
- Скомпилировать с помощью cython
Я объясню, как вы можете это сделать, используя второй, поскольку первый метод не является перекрестной платформой и версией, и объяснялся в других ответах. Кроме того, использование таких программ, как pyinstaller, обычно приводит к огромным размерам файлов, где, поскольку использование cython приведет к тому, что файлы KBs размером
Сначала установите cython. Затем переименуйте файл python (скажем test.py) в файл pyx
$ sudo pip install cython
$ mv test.py test.pyx
Затем вы можете использовать cython вместе с GCC для его компиляции (Cython генерирует файл C из файла Python.pyx, а затем GCC компилирует файл C)
(применительно к fooobar.com/questions/116259/...)
$ cython test.pyx --embed
$ gcc -Os -I /usr/include/python3.5m -o test test.c -lpython3.5m -lpthread -lm -lutil -ldl
ПРИМЕЧАНИЕ. В зависимости от вашей версии python вам может потребоваться изменить последнюю команду. Чтобы узнать, какую версию python вы используете, просто используйте
$ python -V
Теперь у вас будет бинарный файл 'test', который вы ищете
ПРИМЕЧАНИЕ. Cython используется для использования определений переменных C-Type для распределения статической памяти для ускорения программ Python. Однако в вашем случае вы все равно будете использовать традиционные определения Python.
ПРИМЕЧАНИЕ 2. Если вы используете дополнительные библиотеки (например, opencv, например), вам может потребоваться предоставить каталог им с использованием -L, а затем указать имя библиотеки с использованием -l в флагах GCC. Для получения дополнительной информации об этом см. Флаги GCC
Ответ 2
Возможно, вы захотите изучить Nuitka. Он использует исходный код python и преобразует его в вызовы API С++. Затем он компилируется в исполняемый двоичный файл (ELF в Linux). Он существует уже несколько лет и поддерживает широкий спектр версий Python.
Вероятно, вы также получите повышение производительности, если вы его используете. Рекомендуется.
Ответ 3
Параметры замораживания:
Однако ваш целевой сервер должен иметь требуемую среду → вы должны иметь возможность "создать" его. Если это не так, вы должны создать свое программное обеспечение в соответствии с окружающей средой.
Я нашел это удобное руководство по установке пользовательской версии python в virtualenv, предполагая, что у вас есть доступ к ssh: fooobar.com/questions/46917/...
В virtualenv вы должны иметь возможность устанавливать что угодно, и вам не нужно беспокоиться о привилегиях sudo. Конечно, иметь те и доступ к менеджеру пакетов, как apt, делает все намного проще.
Ответ 4
Вероятно, вы ищете что-то вроде Freeze, которое может скомпилировать ваше приложение Python со всеми его библиотеками в статическом двоичном файле:
PyPi страница Freeze
Страница вики Python для Freeze
Страница Sourceforge Freeze
Ответ 5
Чтобы заморозить ваш исполняемый файл python и отправить его по вашему коду, вставьте его в пустую оболочку. Следуйте инструкциям по встраиванию python в приложение из официальной документации . Вы можете приступить к созданию примера приложения непосредственно из кода примера С, который они дают на веб-странице.
Заставьте эту программу выполнить приложение python через встроенный python. Отгрузите программу, встроенный питон, который вы использовали, и свою программу на Python. Выполните эту программу.
Ответ 6
Если вы находитесь на Mac, вы можете использовать py2app для создания пакета .app, который запускает ваше приложение Django, когда вы дважды щелкаете по нему.
Я описал, как связать Django и CherryPy с таким пакетом в https://moosystems.com/articles/14-distribute-django-app-as-native-desktop-app-01.html
В статье я использую pywebview для отображения вашего сайта Django в локальном окне приложения.