Як зробити самостійний виконуваний сценарій Python для виконання без будь-якої залежності?


706

Я будую додаток Python і не хочу змушувати своїх клієнтів встановлювати Python та модулі.

Отже, чи є спосіб скласти сценарій Python, щоб він був самостійним виконуваним файлом?


307
Частина питання, в якій сказано: "Я не хочу змушувати своїх клієнтів встановлювати Python та модулі". Це не говорить про те, що клієнти не можуть цього зробити, він говорить, що розробник не хоче вимагати від них цього. Тут немає сенсу обговорювати цю тему, оскільки клієнти не читають ТА, щоб говорити за себе. Я не хотів би встановлювати середовище розробки Flash лише для того, щоб дивитись на youtube, або середовище розробки C, щоб просто грати на судоку, або середовище розробки Python для запуску версії Angry Birds, написаної на Python. Ось для чого призначені перерозподільні умови виконання.
Дейв

Відповіді:


243

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


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

9
Я маю на увазі, що у вас є дві проблеми : закрите джерело і не-deps. Для закритого джерела компілюйте свій важливий код у C libs за допомогою Cython. Для відсутності deps використовуйте py2exe та зробіть виконуваний файл із файлами .pyd (cython).
neurino

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

@chimpsarehungry, що статичного зв'язку?
Бреден Найкращий

11
Останній реліз, здається, був у 2008 році, чи все ще зберігається?
Zitrax

302

Ви можете використовувати PyInstaller для упаковки програм Python як автономних виконуваних файлів. Він працює в Windows, Linux та Mac.

PyInstaller Quickstart

Встановити 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, це зробити exe, майте на увазі, що ви не можете компілювати для Windows (make exe) в Linux або зробити Linux виконуваним у Windows. Ви можете зробити виконуваний файл платформи, на якій ви працюєте. (В Linux ви можете використовувати вино, щоб
виправдати

14
використовувати "pyinstaller" набагато простіше, ніж "py2exe". Він піклується про всі залежності, включаючи numpy, панди, все що завгодно, і дає вам єдиний виконуваний файл на робочій платформі!
акс

12
Схоже, саме те, що я шукав. А тепер підтримує Python 3! Дякую :)
Данило Грущук

83

Можливо, ви хочете розслідувати Нуїтку . Він приймає вихідний код python і перетворює його в C ++ API-виклики. Потім він компілюється у виконуваний двійковий файл (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 і він працює, але у мене виникли деякі проблеми.

  • Він показав деякі проблеми для створення одиночних файлів у Windows 64 бітах: Використання bundle_files = 1 з py2exe не працює ;

  • Потрібно створити файл setup.py, щоб він працював. http://www.py2exe.org/index.cgi/Tutorial#Step2 ;

  • У мене виникли проблеми із залежностями, які вам доведеться вирішити, імпортуючи пакети у файл налаштування;

  • Мені не вдалося змусити його працювати разом з PyQt ..

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

На мою думку, це набагато краще, тому що:

  • Це простіше у використанні.

Я пропоную створити .bat файл із наступних рядків, наприклад (pyinstaller.exe повинен бути на шляху до Windows):

pyinstaller.exe --onefile MyCode.py

Отже, я думаю, що принаймні для python 2.7 кращим і простішим варіантом є PyInstaller.


3
--onefileПрапор не допоможе вам зробити це портативний на Windows, так як виконуваний файл все ще хоче , щоб зв'язок з api-ms-win-crt-runtime-l1-1-0.dllбібліотекою (або / та інші) , які повинні бути встановлені через vcredistпакет. Отже залежність все ще існує і її потрібно встановити перед запуском.
Андрі

27

Так, можна скласти сценарії Python в автономний виконуваний файл.

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

py2exe перетворює сценарії Python у виконуваний тільки на платформі Windows.

Cython - це статичний компілятор як для мови програмування Python, так і для розширеної мови програмування Cython.


2
Дякую за це Я використовував py2exe і взагалі не міг отримати іконки, що працюють з ним. PyInstaller працював перший раз, і чудово виглядає!
Чуд37

Чи можна створити автономний виконуваний файл з Windows для Linux та macOS? Або мені слід встановити Linux і macOS на VirtualBox? Мені не вистачає вільного місця на ноутбуці.
8Observer8

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


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 / folder.


11

Я також рекомендую pyinstaller для кращої зворотної сумісності, наприклад, python 2.3 - 2.7.
для py2exe у вас повинен бути python 2.6


pyinstaller має проблеми з імпортом. Наприклад: у моєму випадку я перебуваю в цьому DIR ~ / Документи / python101 / і ex50_pycomp.py & ex50.py знаходяться в цьому режимі. ex50_pycomp.py імпортує ex50.py. Я запускаю pyinstaller ex50_pycomp.py, і я бачу всі виконані, вироблені dist. Все добре? Я входжу в dist / ex50_pycomp / і запускаю ex50_pycomp, він працює. Після того, як я помістив цей ex50_pycom у virtualmachine, це говорить про помилку імпорту, а в іншому вікні Linux написано "-bash: ./ex_50_pycom: не можна виконати бінарний файл: помилка формату Exec"
driven_spider

prob1: я використовував python2.7, але pyinstaller розмовляв з python3 python3 setup.py збірка 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: папка розширення 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 зробить файл EXE, який ви хочете, але вам потрібно мати ту саму версію MSVCR90.dll на машині, на якій ви збираєтесь використовувати ваш новий exe. Докладнішу інформацію див. У розділі 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, але тепер є ще й gurpy від google, який перетворює код на Go. Він не підтримує api python C, тому може працювати не для всіх проектів.


4

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

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

  1. У випадку з файлом onefile існує проблема з відсутністю .dll для ОС win7, яка потребує попередньої установки тощо. При звичайній збірці з кількома файлами таких проблем не виникає.
  2. Усі файли, які використовує мій скрипт python (це розгортання веб-сервера tornado і для цього потрібний цілий веб-сайт, який вартує файлів!) Не потрібно переміщати нікуди: я просто створюю ярлик вгорі.
  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.