Я пытаюсь отправить свой код на удаленный сервер, на котором может быть установлена другая версия Python и / или может не быть пакетов, необходимых для моего приложения.
Прямо сейчас для достижения такой переносимости мне нужно создать перемещаемый virtualenv с интерпретатором и кодом. У этого подхода есть некоторые проблемы (например, вам нужно вручную скопировать кучу библиотек в свой virtualenv, поскольку он --always-copy
работает не так, как ожидалось) и обычно медленный.
Есть (теоретически) способ построить сам Python статически.
Интересно, смогу ли я упаковать интерпретатор со своим кодом в один двоичный файл и запустить приложение как модуль. Что-то вроде этого: ./mypython -m myapp run
или ./mypython -m gunicorn -c ./gunicorn.conf myapp.wsgi:application
.
Ответы:
Есть два способа решить вашу проблему
pyinstaller
, илиpy2exe
cython
Я объясню, как вы можете это сделать, используя второй, поскольку первый метод не является кросс-платформой и версией и был объяснен в других ответах. Кроме того, использование таких программ, как pyinstaller, обычно приводит к огромным размерам файлов, тогда как использование cython приведет к созданию файла размером в КБ
Сначала установите
cython
. Затем переименуйте свой файл python (скажемtest.py
) в.pyx
файлЗатем вы можете использовать
cython
вместе с GCC для его компиляции (cython
генерирует файл C из.pyx
файла Python , а затем GCC компилирует файл C)(ссылка на https://stackoverflow.com/a/22040484/5714445 )
cython test.pyx --embed gcc -Os -I /usr/include/python3.5m -o test test.c -lpython3.5m -lpthread -lm -lutil -ldl
ПРИМЕЧАНИЕ . В зависимости от вашей версии python вам может потребоваться изменить последнюю команду. Чтобы узнать, какую версию Python вы используете, просто используйте
Теперь у вас будет двоичный файл test, который вы ищете.
Еще на заметку :
opencv
, например), вам, возможно, придется предоставить им каталог,-L
а затем указать имя используемой библиотеки-l
в флагах GCC. Для получения дополнительной информации см. Флаги GCC.источник
cythonize -i file_0.py [...] file_n.py
для всех ваших модулей Python, а затемcython main_file.py --embed
для вашего основного скрипта. В итоге вы получите исполняемый файл и файлы .so (.dll, .dylib в зависимости от вашей ОС), которые вы сможете использовать вместе как отдельное решение.Возможно, вы захотите исследовать Нуйтку . Он берет исходный код Python и преобразует его в вызовы API C ++. Затем он компилируется в исполняемый двоичный файл (ELF в Linux). Он существует уже несколько лет и поддерживает широкий спектр версий Python.
Вы, вероятно, также получите улучшение производительности, если воспользуетесь им. Рекомендуемые.
источник
Вероятно, вы ищете что-то вроде Freeze, которое может скомпилировать ваше приложение Python со всеми его библиотеками в статический двоичный файл:
Страница PyPi Freeze
Страница Python вики Freeze
Страница Sourceforge Freeze
источник
Если вы работаете на Mac, вы можете использовать py2app для создания пакета .app, который запускает ваше приложение Django при двойном щелчке по нему.
Я описал, как объединить Django и CherryPy в такой комплект, на https://moosystems.com/articles/14-distribute-django-app-as-native-desktop-app-01.html.
В этой статье я использую pywebview для отображения вашего сайта Django в окне локального приложения.
источник
Варианты заморозки:
Однако на вашем целевом сервере должна быть желаемая среда -> у вас должна быть возможность «создать» ее. Если это не так, вам следует создать свое программное обеспечение, соответствующее среде.
Я нашел это удобное руководство о том, как установить пользовательскую версию python в virtualenv, если у вас есть доступ по ssh: https://stackoverflow.com/a/5507373/5616110
В virtualenv вы должны иметь возможность установить что угодно, и вам не нужно беспокоиться о привилегиях sudo. Конечно, их наличие и доступ к диспетчеру пакетов, например, к apt, значительно упрощают работу.
источник