Как сделать скрипт Python автономно исполняемым для запуска без ЛЮБОЙ зависимости?


707

Я создаю приложение Python и не хочу заставлять своих клиентов устанавливать Python и модули.

Итак, есть ли способ скомпилировать скрипт Python для автономного исполняемого файла?


307
Часть вопроса, которая говорит: «Я не хочу заставлять своих клиентов устанавливать Python и модули». Это не говорит, что клиенты не могут сделать это, это говорит, что разработчик не хочет требовать, чтобы они сделали это. Здесь нет смысла обсуждать этот вопрос, потому что клиенты не читают ТАК, чтобы говорить за себя. Я бы не хотел устанавливать среду разработки Flash только для просмотра YouTube, или среду разработки C, чтобы играть в судоку, или среду разработки Python для запуска версии Angry Birds, написанной на Python. Вот для чего нужны распространяемые среды выполнения.
Дейв

Ответы:


243

Вы можете использовать py2exe, как уже ответили, и использовать cython для преобразования ваших ключевых .pyфайлов в .pycC-скомпилированные файлы, как .dllв Windows и .soв Linux, гораздо труднее восстановить, чем обычные .pyoи .pycфайлы (а также повысить производительность!)


1
Спасибо за ответ. Я рассмотрел Cython, но, похоже, ему все еще нужен Python для запуска скомпилированного исполняемого файла. Вы имеете в виду компиляцию скрипта в .pyc с использованием Cython? (Я не знал, есть ли у Cython такая функция)
Джефф

9
Я имею в виду, что у вас есть две проблемы : закрытый исходный код и отсутствие ошибок. Для закрытого исходного кода скомпилируйте ваш важный код на C libs, используя Cython. Для no-deps используйте py2exe и создайте исполняемый файл с файлами .pyd (скомпилированные Cython) внутри.
Нейрино

7
Что бы вы сделали с библиотеками (numpy, scipy, matplotlib)? Например, как клиенты смогут использовать функцию ginput () в matplotlib из исполняемого файла, не устанавливая ее на своем компьютере.
шимпанзе

@chimpsarehungry как насчет статических ссылок?
Брэден Бест

11
Последний релиз, кажется, в 2008 году, это все еще поддерживается?
Цитрак

302

Вы можете использовать PyInstaller для упаковки программ на Python как автономных исполняемых файлов. Работает на Windows, Linux и Mac.

Быстрый запуск PyInstaller

Установите PyInstaller из PyPI:

pip install pyinstaller

Перейдите в каталог вашей программы и запустите:

pyinstaller yourprogram.py

Это создаст пакет в подкаталоге с именем dist.

Для более подробного ознакомления см. Руководство .


10
Стоит отметить, что pyinstaller может скомпилировать в один файл .exe. Кроме того, на какой ОС он запускается, делает этот исполняемый файл, т.е. .exe при запуске в Windows
Ричард де Вит

2
@ ItayMoav-Malimovka Они работают в поддержке Python 3. См. Github.com/pyinstaller/pyinstaller/tree/python3 .
PhoneixS

3
Как сказал @GeenHenk, если вы «компилируете» в Windows, это делает исполняемый файл, имейте в виду, что вы не можете компилировать для Windows (сделать исполняемый файл) в Linux или сделать исполняемый файл Linux в Windows. Вы можете сделать только исполняемый файл той платформы, на которой вы работаете. (В Linux вы можете использовать вино, чтобы обмануть это)
PhoneixS

14
Использование pyinstaller намного проще, чем py2exe. Он заботится о всех зависимостях, включая numpy, pandas, что угодно и дает вам один исполняемый файл на рабочей платформе!
AKS

12
Похоже, именно то, что я искал. И теперь поддерживает Python 3! Спасибо :)
Даниэль Gruszczyk

83

Вы можете исследовать Нуитку . Он берет исходный код Python и преобразует его в вызовы API C ++. Затем он компилируется в исполняемый двоичный файл (ELF в Linux). Он существует уже несколько лет и поддерживает широкий спектр версий Python.

Вероятно, вы также получите улучшение производительности, если будете его использовать. Рекомендуемые.


5
Нуитка это потрясающий инструмент. Не нужно его использовать. Я бы только отметил одну вещь - это не только Linux - это кроссплатформенность - еще одна причина, по которой его следует использовать.
sjaustirni

5
Nuitka работает на Python 2.6, 2.7, 3.2, 3.3 и 3.4 и является кроссплатформенной: (Linux, FreeBSD, NetBSD, MacOS X и Windows (32/64 бита). Другие также могут работать. Архитектура: x86, x86_64 (amd64) и arm. Другие архитектуры также могут работать, из коробки.)
Джонатан Хартли

Это не поддерживается для последних 3.6 .. и это кошмар для установки на Windows
Tetora

Работает как прелесть в macOS High Sierra + Python 3.5.2. Спасибо!
Энтони Л.

Создает ли это отдельный исполняемый файл?
голоса

31

Я хотел бы собрать некоторую полезную информацию о создании автономных файлов в Windows, используя Python 2.7.

Я использовал py2exe, и он работает, но у меня были некоторые проблемы.

Эта последняя причина заставила меня попробовать PyInstaller http://www.pyinstaller.org/ .

На мой взгляд, это намного лучше, потому что:

  • Это проще в использовании.

Я предлагаю создать файл .bat со следующими строками, например (pyinstaller.exe должен быть в Windows Path):

pyinstaller.exe --onefile MyCode.py

Итак, я думаю, что, по крайней мере для Python 2.7, лучше и проще вариант PyInstaller.


3
--onefileФлаг не поможет вам сделать это портативный на Windows, так как исполняемый файл все еще хочет , чтобы связь с api-ms-win-crt-runtime-l1-1-0.dllбиблиотекой (или / и другие) , которые должны быть установлены через vcredistпакет. Таким образом, зависимость все еще существует и должна быть установлена ​​до запуска.
Andry

27

Да, есть возможность компилировать скрипты Python в отдельный исполняемый файл.

PyInstaller может использоваться для преобразования программ Python в автономные исполняемые файлы под Windows , Linux , Mac OS X , FreeBSD , Solaris и AIX . Это один из рекомендуемых конвертеров.

py2exe преобразует скрипты Python в исполняемый файл только на платформе Windows.

Cython является статическим компилятором как для языка программирования Python, так и для расширенного языка программирования Cython.


2
Спасибо за это. Я использовал py2exe, и не мог заставить значки работать с ним вообще. PyInstaller работал первый раз, и выглядит великолепно!
Chud37

Могу ли я создать автономный исполняемый файл из Windows для Linux и macOS? Или я должен установить Linux и macOS на VirtualBox? Мне не хватает свободного места на моем ноутбуке.
8Observer8

1
Я нашел ответ на мой вопрос в документации здесь: pyinstaller.readthedocs.io/en/stable/…
8Observer8

26

И третий вариант - cx_Freezeкроссплатформенный.


1
Здесь мы находимся в феврале 2019 года, и cx_Freezeс конца 2017 года на pypi нет перечисленных выпусков. Был ли этот проект заброшен?
user9074332

17

вам может понравиться py2exe . вы также найдете там информацию о том, как сделать это на Linux


2
Но вам нужно будет предоставить пакету все варианты.
Якоб Бойер

14

Используйте py2exe .... используйте ниже настроенные файлы:

 from distutils.core import setup
 import py2exe

 from distutils.filelist import findall
 import matplotlib

 setup(
       console=['PlotMemInfo.py'],

       options={
                'py2exe': {
                'packages' : ['matplotlib'],
            'dll_excludes': ['libgdk-win32-2.0-0.dll',
                                 'libgobject-2.0-0.dll',
                 'libgdk_pixbuf-2.0-0.dll']
                          }
                },
       data_files = matplotlib.get_py2exe_datafiles()
     )

Я сделал это, и он создал файл python27.dll, и он все еще требуется. Я переместил файл .exe из папки, содержащей файл python27.dll, и файл .exe больше не запускается.
mjwrazor

Не могли бы вы показать такой скрипт для Linux и macOS? Я хочу создать автономные исполняемые файлы из Windows для Linux и macOS.
8Observer8

13

Мне нравится pyinstaller - особенно "оконный" вариант:

pyinstaller --onefile --windowed myscript.py

Он создаст один файл * .exe в папке dist /.


11

Я также рекомендую pyinstaller для лучшей обратной совместимости, такой как python 2.3 - 2.7.
для py2exe у вас должен быть python 2.6


У pyinstaller проблемы с импортом. Например: в моем случае я в этом DIR ~ / Documents / python101 / и ex50_pycomp.py & ex50.py в этом каталоге. ex50_pycomp.py импортирует ex50.py. Я запускаю pyinstaller ex50_pycomp.py и вижу, что все выполнено, произведено dist. Все хорошо, верно? Я перехожу в dist / ex50_pycomp / и запускаю ex50_pycomp, это работает. После того, как я поместил этот ex50_pycom в виртуальную машину, это говорит об ошибке импорта, а в другом другом linux-окне написано «-bash: ./ex_50_pycom: невозможно выполнить двоичный файл: ошибка формата Exec»
driven_spider

prob1: я использовал python2.7, но pyinstaller говорил с python3 python3 setup.py build python3 setup.py установить ваш python3 получит все pkg_resources prob 3: если использование sys_path становится проблемой, так что укажите свой путь, как этот pyinstaller --hidden- import = pkg_resources --onefile file.py --path = my_path rw-rw-r-- my_path: папка dist для python3 pyinstaller --hidden-import = pkg_resources --onefile file.py --path = / usr / local / lib /python3.5/dist-packages/my_code_lib-0+untagged.8.gd264bd5.dirty-py3.5.egg/my_folder -rw-rw-r--
driven_spider

8

Для скриптов Python 3.2 единственным выбором является Cxfreeze. Соберите его из источников, иначе он не будет работать.

Для python 2.x я предлагаю pyinstaller, поскольку он может упаковать программу на python в один исполняемый файл, в отличие от CxFreeze, который выводит также библиотеки.


6

py2exe сделает исполняемый файл, который вы хотите, но вам нужно иметь ту же версию MSVCR90.dll на компьютере, на котором вы собираетесь использовать новый исполняемый файл. См. Http://www.py2exe.org/index.cgi/Tutorial для получения дополнительной информации.


6

Вы можете найти список утилит распространения, перечисленных в @ https://wiki.python.org/moin/DistributionUtilities .

Я использую bbfreeze, и он работал очень хорошо (хотя поддержка Python 3 еще не была).


stackoverflow.com/questions/33683133/… Я использую очень хороший пакет bbfreeze.
user914425

Он заботится о зависимостях и устанавливает соответствующие модули py?
Volatil3

@ Volatil3 Да, все зависимости позаботились. WRT для установки модулей на хост-систему - существуют разные виды компиляций. Bbfreeze скомпилирует все в несколько .soфайлов или скопирует файлы .egg напрямую, и все они будут присутствовать в одном каталоге (или как один файл). Там не требуется установка.
Джо

6
pyinstaller yourfile.py -F --onefile

Это создает автономный EXE-файл в Windows. ВАЖНОЕ ПРИМЕЧАНИЕ: EXE-файл будет создан в папке с именем «dist».

вы можете установить pyinstaller используя pip install PyInstaller

введите описание изображения здесь

введите описание изображения здесь


4

Не совсем упаковка кода Python, но теперь есть и сварливый от Google, который переносит код в Go. Он не поддерживает Python C API, поэтому он может работать не для всех проектов.


4

Используя pyinstaller, я нашел лучший способ, используя ярлык для .exe вместо создания --onefile. В любом случае, вероятно, есть некоторые файлы данных, и если вы запускаете приложение для сайта, то ваша программа также зависит от файлов html, js, css. Нет смысла перемещать все эти файлы куда-нибудь ... вместо этого, что если мы переместим рабочий путь вверх.

Создайте ярлык для исполняемого файла, переместите его сверху и задайте пути назначения и запуска, как указано, чтобы относительные пути шли в dist \ folder: Target: %windir%\system32\cmd.exe /c start dist\web_wrapper\web_wrapper.exe Start in: "%windir%\system32\cmd.exe /c start dist\web_wrapper\" можно переименовать ярлык во что угодно, переименовав в «GTFS-Manager»
Теперь, когда я дважды -нажмите ярлык, как будто я запустил файл на python! Я нашел этот подход лучше, чем тот, --onefileкоторый:

  1. В случае с одним файлом существует проблема с отсутствием .dll для ОС win7, которая требует предварительной установки и т. Д. Зевок. При обычной сборке с несколькими файлами таких проблем нет.
  2. Все файлы, которые использует мой скрипт на python (он развертывает веб-сервер торнадо и требует целого ряда файлов для сайта!), Не нужно никуда перемещать: я просто создаю ярлык сверху.
  3. Я действительно могу использовать эту же папку в Ubuntu (запустить python3 myfile.py) и Windows (дважды щелкните ярлык).
  4. Мне не нужно беспокоиться о слишком сложном взломе файла .spec, чтобы включить файлы данных и т. Д.

О, не забудьте удалить папку сборки после сборки, сэкономите на размере.


Привет, просто обновление .. Я решил отказаться от сжатия UPX и, наконец, пойти по пути --onefile. Пришлось выбрать один, потому что в настоящее время в UPX есть ошибка при сжатии определенной DLL.
Nikhil VJ

3

Используйте Cython, чтобы конвертировать в c, компилировать и связывать с gcc. Другой может быть сделать основные функции в c (те, которые вы хотите сделать сложными для реверсии), скомпилировать их и использовать python boost для импорта скомпилированного кода (плюс вы получите намного более быстрое выполнение кода). затем используйте любой инструмент, упомянутый для распространения.


1

Мне сказали, что PyRun, https://www.egenix.com/products/python/PyRun/ , также является опцией.


5
Ссылка на решение приветствуется, но, пожалуйста, убедитесь, что ваш ответ полезен без нее: добавьте контекст вокруг ссылки, чтобы ваши коллеги-пользователи имели представление о том, что это такое и почему, а затем процитируйте наиболее релевантную часть страницы, которую вы ' Повторная ссылка на случай, если целевая страница недоступна. Ответы, которые немного больше, чем ссылка, могут быть удалены.
Петтер Фриберг

Эта опция в настоящее время не поддерживает Windows.
Боб
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.