Подтвердить что ты не робот

Есть ли способ скомпилировать приложение python в статический двоичный файл?

То, что я пытаюсь сделать, это отправить мой код на удаленный сервер, который может иметь другую версию python и/или может не иметь пакетов, требуемых моим приложением.

Прямо сейчас, чтобы добиться такой переносимости, мне нужно создать перемещаемый virtualenv с помощью интерпретатора и кода. У этого подхода есть некоторые проблемы (например, вам нужно вручную скопировать кучу библиотек в ваш virtualenv, так как --always-copy работает не так, как ожидалось) и обычно медленнее.

Там (теоретически) путь для создания самого python статически.

Интересно, могу ли я упаковать интерпретатор с моим кодом в один двоичный файл и запустить мое приложение в качестве модуля. Что-то вроде этого: ./mypython -m myapp run или ./mypython -m gunicorn -c ./gunicorn.conf myapp.wsgi:application.

4b9b3361

Ответ 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, делает все намного проще.

Ответ 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 в локальном окне приложения.