You are currently viewing Использование PyInstaller для легкого распространения приложений на Python

Использование PyInstaller для легкого распространения приложений на Python

Вы завидуете разработчикам Go, создающим исполняемый файл и легко отправляющим его пользователям? Разве не было бы здорово, если бы ваши пользователи могли запускать ваше приложение, ничего не устанавливая? Это мечта, и PyInstaller-один из способов достичь этого в экосистеме Python.

Существует бесчисленное множество руководств по настройке виртуальных сред, управлению зависимостямии публикации в PyPI, что полезно при создании библиотек Python. Существует гораздо меньше информации для разработчиков, создающих приложения на Python. Этот учебник предназначен для разработчиков, которые хотят распространять приложения среди пользователей, которые могут быть или не быть разработчиками Python.

В этом уроке вы узнаете следующее:

  • Как PyInstaller может упростить распространение приложений
  • Как использовать PyInstaller в ваших собственных проектах
  • Как отлаживать ошибки PyInstaller
  • Чего не может сделать PyInstaller

PyInstaller дает вам возможность создать папку или исполняемый файл, который пользователи могут немедленно запустить без какой-либо дополнительной установки. Чтобы в полной мере оценить возможности PyInstaller, полезно вернуться к некоторым проблемам с дистрибутивом, которых помогает избежать PyInstaller.

Проблемы с распределением

Настройка проекта на Python может быть неприятной, особенно для тех, кто не является разработчиком. Часто настройка начинается с открытия терминала, который не является стартовым для огромной группы потенциальных пользователей. Это препятствие останавливает пользователей еще до того, как руководство по установке углубится в сложные детали виртуальных сред, версий Python и множества потенциальных зависимостей.

Подумайте о том, через что вы обычно проходите при настройке новой машины для разработки на Python. Вероятно, это звучит примерно так:

  • Загрузите и установите определенную версию Python
  • Настройка pip
  • Настройка виртуальной среды
  • Получите копию своего кода
  • Установка зависимостей

Остановитесь на мгновение и подумайте, имеет ли какой-либо смысл любой из вышеперечисленных шагов, если вы не разработчик, не говоря уже о разработчике Python. Скорее всего, нет.

Эти проблемы возникают, если вашему пользователю посчастливится добраться до части установки «Зависимости». Это стало намного лучше за последние несколько лет с преобладанием колес, но некоторые зависимости все еще требуют компиляторов C/C++ или даже FORTRAN!

Этот барьер для входа слишком высок, если ваша цель-сделать приложение доступным для как можно большего числа пользователей. Как часто говорит Раймонд Хеттингер в своих замечательных выступлениях, “Должен быть лучший способ”.

PyInstaller

PyInstaller абстрагирует эти сведения от пользователя, находя все ваши зависимости и объединяя их вместе. Ваши пользователи даже не будут знать, что они запускают проект Python, потому что сам интерпретатор Python встроен в ваше приложение. Прощайте, сложные инструкции по установке!

PyInstaller выполняет этот удивительный подвиг, исследуя ваш код Python, обнаруживая ваши зависимости, а затем упаковывая их в подходящий формат в зависимости от вашей операционной системы.

Есть много интересных подробностей о PyInstaller, но сейчас вы узнаете основы того, как он работает и как его использовать. Вы всегда можете обратиться к отличным документам PyInstaller, если хотите получить более подробную информацию.

Кроме того, PyInstaller может создавать исполняемые файлы для Windows, Linux или macOS. Это означает , что пользователи Windows получат a .exe, пользователи Linux получат обычный исполняемый файл, а пользователи macOS получат .app пакет. В этом есть некоторые предостережения. Дополнительную информацию смотрите в разделе ограничения.

Подготовка вашего проекта

PyInstaller требует, чтобы ваше приложение соответствовало некоторой минимальной структуре, а именно, чтобы у вас был сценарий CLI для запуска приложения. Часто это означает создание небольшого скрипта вне вашего пакета Python, который просто импортирует ваш пакет и запускается main().

Сценарий точки входа-это скрипт на Python. Технически вы можете делать все, что захотите, в сценарии точки входа, но вам следует избегать использования явного относительного импорта. Вы все еще можете использовать относительный импорт во всем остальном приложении, если это ваш предпочтительный стиль.

Примечание.Точка входа-это код, с которого запускается ваш проект или приложение.

Вы можете попробовать это в своем собственном проекте или следовать вместе с реальным проектом Python feed reader. Для получения более подробной информации о проекте reader ознакомьтесь с руководством по публикации пакета на PyPI.

Первым шагом к созданию исполняемой версии этого проекта является добавление сценария точки входа. К счастью, проект feed reader хорошо структурирован, поэтому все, что вам нужно, — это короткий скрипт вне пакета, чтобы запустить его. Например, вы можете создать файл, называемый cli.py вместе с пакетом чтения, со следующим кодом:

from reader.__main__ import main

if __name__ == '__main__':
    main()

Этот cli.py сценарий вызывает main() для запуска программы чтения ленты.

Создание этого сценария точки входа просто, когда вы работаете над своим собственным проектом, потому что вы знакомы с кодом. Однако найти точку входа в код другого человека не так просто. В этом случае вы можете начать с просмотра setup.py файла в стороннем проекте.

Поищите ссылку на entry_points аргумент в проекте setup.py. Например, вот проект «читатель»setup.py:

setup(
    name="realpython-reader",
    version="1.0.0",
    description="Read the latest Real Python tutorials",
    long_description=README,
    long_description_content_type="text/markdown",
    url="https://github.com/realpython/reader",
    author="Real Python",
    author_email="info@/programbox.ru",
    license="MIT",
    classifiers=[
        "License :: OSI Approved :: MIT License",
        "Programming Language :: Python",
        "Programming Language :: Python :: 2",
        "Programming Language :: Python :: 3",
    ],
    packages=["reader"],
    include_package_data=True,
    install_requires=[
        "feedparser", "html2text", "importlib_resources", "typing"
    ],
    entry_points={"console_scripts": ["realpython=reader.__main__:main"]},
)

Как вы можете видеть, сценарий точки входа cli.py вызывает ту же функцию, что и в entry_points аргументе.

После этого изменения каталог проекта reader должен выглядеть следующим образом, если предположить, что вы перенесли его в папку под названием reader:

reader/
|
├── reader/
|   ├── __init__.py
|   ├── __main__.py
|   ├── config.cfg
|   ├── feed.py
|   └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests

Обратите внимание, что в самом коде считывателя нет никаких изменений, просто вызывается новый файл cli.py. Этот сценарий точки входа обычно является всем, что необходимо для использования вашего проекта с PyInstaller.

Однако вы также захотите обратить внимание на использование __import__() или импорт внутри функций. В терминологии PyInstaller они называются скрытым импортом.

Вы можете вручную указать скрытый импорт, чтобы заставить PyInstaller включить эти зависимости, если изменение импорта в вашем приложении слишком сложно. Вы увидите, как это сделать позже в этом уроке.

Как только вы сможете запустить свое приложение с помощью скрипта Python вне вашего пакета, вы будете готовы дать PyInstaller возможность попробовать создать исполняемый файл.

Использование PyInstaller

Первым шагом является установка PyInstaller из PyPI. Вы можете сделать это, используя pip, как и другие пакеты Python:

$ pip install pyinstaller

pip установит зависимости PyInstaller вместе с новой командой: pyinstaller. PyInstaller можно импортировать в ваш код Python и использовать в качестве библиотеки, но вы, скорее всего, будете использовать его только в качестве инструмента командной строки.

Вы будете использовать интерфейс библиотеки, если создадите свои собственные файлы подключений.

Вы увеличите вероятность того, что PyInstaller по умолчанию создаст исполняемый файл, если у вас есть только чистые зависимости Python. Однако не стоит слишком сильно напрягаться, если у вас более сложные зависимости с расширениями C/C++.

PyInstaller поддерживает множество популярных пакетов, таких как NumPyPyQtи Matplotlib, без какой-либо дополнительной работы с вашей стороны. Вы можете узнать больше о списке пакетов, которые официально поддерживает PyInstaller, обратившись к документации PyInstaller.

Не волнуйтесь, если некоторые из ваших зависимостей не указаны в официальных документах. Многие пакеты Python работают нормально. На самом деле PyInstaller настолько популярен, что во многих проектах есть объяснения того, как заставить вещи работать с PyInstaller.

Короче говоря, шансы на то, что ваш проект сработает «из коробки», высоки.

Чтобы попробовать создать исполняемый файл со всеми настройками по умолчанию, просто дайте PyInstaller имя вашего основного сценария точки входа.

Во-первых, cd в папке с вашей точкой входа и передайте ее в качестве аргумента pyinstaller команде, которая была добавлена к вам PATH при установке PyInstaller.

Например, введите следующее после вас cd в reader каталог верхнего уровня, если вы следуете вместе с проектом чтения ленты:

$ pyinstaller cli.py

Не пугайтесь, если во время создания исполняемого файла вы увидите много выходных данных. PyInstaller по умолчанию многословен, и многословие может быть увеличено для отладки, что вы увидите позже.

Копание в артефактах PyInstaller

PyInstaller сложен под капотом и создаст много выходных данных. Поэтому важно знать, на чем сосредоточиться в первую очередь. А именно, исполняемый файл, который вы можете распространять среди своих пользователей, и потенциальную отладочную информацию. По умолчанию pyinstaller команда создаст несколько интересных вещей:

  • Файл *.spec
  • Папка build/
  • Папка dist/

Файл спецификации

Файл спецификации по умолчанию будет назван в честь вашего сценария CLI. Придерживаясь нашего предыдущего примера, вы увидите файл под названием cli.spec. Вот как выглядит файл спецификации по умолчанию после запуска PyInstaller в cli.py файле:

# -*- mode: python -*-

block_cipher = None

a = Analysis(['cli.py'],
             pathex=['/Users/realpython/pyinstaller/reader'],
             binaries=[],
             datas=[],
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          [],
          exclude_binaries=True,
          name='cli',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          console=True )
coll = COLLECT(exe,
               a.binaries,
               a.zipfiles,
               a.datas,
               strip=False,
               upx=True,
               name='cli')

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

Не волнуйтесь, вам не нужно понимать приведенный выше код, чтобы эффективно использовать PyInstaller!

Этот файл можно изменить и повторно использовать для последующего создания исполняемых файлов. Вы можете немного ускорить будущие сборки, предоставив команде этот файл спецификации вместо сценария точки входа pyinstaller.

Существует несколько конкретных вариантов использования файлов спецификаций PyInstaller. Однако для простых проектов вам не нужно будет беспокоиться об этих деталях, если только вы не хотите сильно настроить способ построения вашего проекта.

Папка сборки

В build/ папку PyInstaller помещается большая часть метаданных и внутренней бухгалтерии для создания исполняемого файла. Содержимое по умолчанию будет выглядеть примерно так:

build/
|
└── cli/
    ├── Analysis-00.toc
    ├── base_library.zip
    ├── COLLECT-00.toc
    ├── EXE-00.toc
    ├── PKG-00.pkg
    ├── PKG-00.toc
    ├── PYZ-00.pyz
    ├── PYZ-00.toc
    ├── warn-cli.txt
    └── xref-cli.html

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

Папка Dist

После сборки вы получите dist/ папку, похожую на следующую:

dist/
|
└── cli/
    └── cli

В dist/ папке содержится окончательный артефакт, который вы хотите отправить своим пользователям. Внутри dist/ папки есть папка, названная в честь вашей точки входа. Таким образом, в этом примере у вас будет dist/cli папка, содержащая все зависимости и исполняемый файл для нашего приложения. Исполняемый файл для запуска dist/cli/cliилиdist/cli/cli.exe, если вы находитесь в Windows.

Вы также найдете множество файлов с расширением.so.pyd, и .dll в зависимости от вашей операционной системы. Это общие библиотеки, которые представляют зависимости вашего проекта, созданные и собранные PyInstaller.

Примечание: Вы можете добавить *.specbuild/, и dist/ в свой .gitignore файл, чтобы сохранить git status его в чистоте, если вы используете git для контроля версий. Файл GitHub gitignore по умолчанию для проектов Python уже делает это за вас.

Вы захотите распространить всю dist/cli папку целиком, но вы можете переименовать cliее во что угодно, что вам подходит.

На этом этапе вы можете попробовать запустить dist/cli/cli исполняемый файл, если вы следуете примеру с программой чтения ленты.

Вы заметите, что запуск исполняемого файла приводит к ошибкам с упоминанием version.txt файла. Это связано с тем, что для чтения ленты и ее зависимостей требуются некоторые дополнительные файлы данных, о которых PyInstaller не знает. Чтобы исправить это, вам придется сообщить PyInstaller, что version.txt требуется, о чем вы узнаете при тестировании вашего нового исполняемого файла.

Настройка ваших сборок

PyInstaller поставляется с множеством опций, которые могут быть предоставлены в виде файлов спецификаций или обычных параметров интерфейса командной строки. Ниже вы найдете некоторые из наиболее распространенных и полезных опций.

--name

Измените имя вашего исполняемого файла.

Это способ избежать того, чтобы ваши исполняемые файлы, файлы спецификаций и папки артефактов сборки были названы в честь вашего сценария точки входа. --name это полезно , если у вас есть привычка называть свой сценарий точки входа чем-то вроде cli.py, как это делаю я.

Вы можете создать исполняемый файл, вызываемый realpython из cli.py сценария, с помощью такой команды:

$ pyinstaller cli.py --name realpython

--onefile

Упакуйте все ваше приложение в один исполняемый файл.

Параметры по умолчанию создают папку зависимостей и исполняемых файлов и, в то --onefile время как упрощают распространение, создавая только исполняемый файл.

Этот параметр не принимает аргументов. Чтобы объединить ваш проект в один файл, вы можете выполнить сборку с помощью такой команды:

$ pyinstaller cli.py --onefile

С помощью приведенной выше команды ваша dist/ папка будет содержать только один исполняемый файл, а не папку со всеми зависимостями в отдельных файлах.

--hidden-import

Перечислите несколько импортных файлов верхнего уровня, которые PyInstaller не смог обнаружить автоматически.

Это один из способов обойти ваш код, используя import внутренние функции и __import__(). Вы также можете использовать --hidden-import несколько раз одну и ту же команду.

Для этого параметра требуется имя пакета, который вы хотите включить в исполняемый файл. Например, если ваш проект импортировал библиотеку запросов внутри функции, то PyInstaller не будет автоматически включаться requests в ваш исполняемый файл. Вы можете использовать следующую команду, чтобы принудительно requests включить:

$ pyinstaller cli.py --hiddenimport=requests

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

--add-data и --add-binary

Попросите PyInstaller вставить дополнительные данные или двоичные файлы в вашу сборку.

Это полезно, когда вы хотите объединить файлы конфигурации, примеры или другие данные, не относящиеся к коду. Вы увидите пример этого позже, если будете следить за проектом чтения ленты.

--exclude-module

Исключите некоторые модули из вашего исполняемого файла

Это полезно для исключения требований только для разработчиков, таких как рамки тестирования. Это отличный способ сохранить артефакт, который вы предоставляете пользователям, как можно меньшим. Например, если вы используете , вы можете исключить это из своего исполняемого файла:

$ pyinstaller cli.py --exclude-module=pytest

-w

Избегайте автоматического открытия окна консоли для stdout ведения журнала.

Это полезно только в том случае, если вы создаете приложение с поддержкой графического интерфейса. Это помогает скрыть детали вашей реализации, позволяя пользователям никогда не видеть терминал.

Аналогично --onefile варианту, -w не принимает аргументов:

$ pyinstaller cli.py -w

.spec file

Как упоминалось ранее, вы можете повторно использовать автоматически сгенерированный .spec файл для дальнейшей настройки исполняемого файла. .spec Файл представляет собой обычный скрипт Python, который неявно использует API библиотеки PyInstaller.

Поскольку это обычный скрипт на Python, вы можете делать в нем почти все, что угодно. Вы можете обратиться к официальной документации файла спецификации PyInstaller для получения дополнительной информации об этом API.

Тестирование вашего нового исполняемого файла

Лучший способ протестировать ваш новый исполняемый файл-это на новой машине. Новая машина должна иметь ту же операционную систему, что и ваша машина сборки. В идеале эта машина должна быть как можно более похожа на то, что используют ваши пользователи. Это может быть не всегда возможно, поэтому следующее, что лучше всего, — это тестирование на вашей собственной машине.

Ключ состоит в том, чтобы запустить полученный исполняемый файл без активации среды разработки. Это означает запуск без virtualenvconda, или любой другой среды , которая может получить доступ к вашей установке Python. Помните, что одна из основных целей исполняемого файла, созданного PyInstaller, состоит в том, чтобы пользователям не требовалось ничего устанавливать на их компьютере.

Продолжая пример с программой чтения ленты, вы заметите, что запуск cli исполняемого файла по умолчанию в dist/cli папке завершается неудачно. К счастью, ошибка указывает вам на проблему:

FileNotFoundError: 'version.txt' resource not found in 'importlib_resources'
[15110] Failed to execute script cli

Для importlib_resources пакета требуется version.txt файл. Вы можете добавить этот файл в сборку, используя --add-data опцию. Вот пример того, как включить необходимый version.txt файл:

$ pyinstaller cli.py \
    --add-data venv/reader/lib/python3.6/site-packages/importlib_resources/version.txt:importlib_resources

Эта команда указывает PyInstaller включить version.txt файл в importlib_resources папку в новую папку в вашей сборке под названием importlib_resources.

Примечание: pyinstaller Команды используют \символ, чтобы облегчить чтение команды. Вы можете опустить команды \при выполнении самостоятельно или скопировать и вставить команды, как показано ниже, при условии, что вы используете те же пути.

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

Теперь запуск нового исполняемого файла приведет к новой ошибке о config.cfg файле.

Этот файл требуется для проекта чтения ленты, поэтому вам нужно будет обязательно включить его в свою сборку:

$ pyinstaller cli.py \
    --add-data venv/reader/lib/python3.6/site-packages/importlib_resources/version.txt:importlib_resources \
    --add-data reader/config.cfg:reader

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

На данный момент у вас должен быть рабочий исполняемый файл, который можно предоставить непосредственно пользователям!

Отладка исполняемых файлов PyInstaller

Как вы видели выше, вы можете столкнуться с проблемами при запуске исполняемого файла. В зависимости от сложности вашего проекта исправления могут быть такими же простыми, как включение файлов данных, таких как пример программы чтения каналов. Однако иногда вам требуется больше методов отладки.

Ниже приведены несколько распространенных стратегий, которые не расположены в определенном порядке. Часто одна из этих стратегий или их комбинация приводят к прорыву в сложных сеансах отладки.

Используйте терминал

Во-первых, попробуйте запустить исполняемый файл с терминала, чтобы вы могли видеть все выходные данные.

Не забудьте снять флаг -w сборки, чтобы увидеть все stdout в окне консоли. Часто вы увидите ImportError исключения, если зависимость отсутствует.

Отладочные файлы

Проверьте build/cli/warn-cli.txt файл на наличие каких-либо проблем. PyInstaller создает множество выходных данных, которые помогут вам точно понять, что он создает. Покопаться в build/ папке — отличное место для начала.

Сборки из одного Каталога

Используйте режим --onedir распространения для создания папки распространения вместо одного исполняемого файла. Опять же, это режим по умолчанию. Сборка с --onedir помощью дает вам возможность проверить все включенные зависимости, а не все, что скрыто в одном исполняемом файле.

--onedir полезен для отладки, но--onefile, как правило, проще для понимания пользователями. После отладки вы можете переключиться в --onefile режим, чтобы упростить распространение.

Дополнительные параметры интерфейса командной строки

PyInstaller также имеет опции для управления объемом информации, печатаемой в процессе сборки. Перестройте исполняемый файл с --log-level=DEBUG возможностью PyInstaller и просмотрите выходные данные.

PyInstaller создаст много выходных данных при увеличении многословия с --log-level=DEBUG помощью . Полезно сохранить эти выходные данные в файл, к которому вы сможете обратиться позже, вместо прокрутки в вашем терминале. Для этого вы можете использовать функцию перенаправления вашей оболочки. Вот пример:

$ pyinstaller --log-level=DEBUG cli.py 2> build.txt

Используя приведенную выше команду, вы получите файл с именем build.txt, содержащий множество дополнительных DEBUG сообщений.

Примечание: Стандартного перенаправления с >помощью недостаточно. PyInstaller печатает в stderr потоке, нет stdout. Это означает, что вам нужно перенаправить stderr поток в файл, что можно сделать с помощью 2, как в предыдущей команде.

Вот пример build.txt того, как может выглядеть ваш файл:

67 INFO: PyInstaller: 3.4
67 INFO: Python: 3.6.6
73 INFO: Platform: Darwin-18.2.0-x86_64-i386-64bit
74 INFO: wrote /Users/realpython/pyinstaller/reader/cli.spec
74 DEBUG: Testing for UPX ...
77 INFO: UPX is not available.
78 DEBUG: script: /Users/realptyhon/pyinstaller/reader/cli.py
78 INFO: Extending PYTHONPATH with paths
['/Users/realpython/pyinstaller/reader',
 '/Users/realpython/pyinstaller/reader']

В этом файле будет много подробной информации о том, что было включено в вашу сборку, почему что-то не было включено и как был упакован исполняемый файл.

Вы также можете перестроить свой исполняемый файл, используя эту --debug опцию в дополнение к использованию --log-level опции для получения еще большей информации.

Примечание: Параметры -y и --clean полезны при перестройке, особенно при первоначальной настройке сборок или построении с непрерывной интеграцией. Эти параметры удаляют старые сборки и исключают необходимость ввода данных пользователем в процессе сборки.

Дополнительные документы PyInstaller

Вики PyInstaller на GitHub содержит множество полезных ссылок и советов по отладке. Наиболее примечательны разделы о том, как убедиться, что все упаковано правильно, и что делать, если что-то пойдет не так.

Помощь в выявлении зависимостей

Наиболее распространенная проблема, с которой вы столкнетесь, — это ImportError исключения, если PyInstaller не смог правильно определить все ваши зависимости. Как упоминалось ранее, это может произойти , если вы используете__import__(), импортируете внутренние функции или другие типы скрытого импорта.

Многие из этих типов проблем могут быть решены с помощью --hidden-import опции интерфейса командной строки PyInstaller. Это говорит PyInstaller включить модуль или пакет, даже если он не обнаруживает его автоматически. Это самый простой способ обойти множество динамических функций импорта в вашем приложении.

Еще один способ обойти проблемы-это подключить файлы. Эти файлы содержат дополнительную информацию, которая поможет PyInstaller упаковать зависимость. Вы можете написать свои собственные хуки и указать PyInstaller использовать их с опцией --additional-hooks-dir CLI.

Файлы крючков-это то, как сам PyInstaller работает внутренне, поэтому вы можете найти множество примеров файлов крючков в исходном коде PyInstaller.

Ограничения

PyInstaller невероятно мощный, но у него есть некоторые ограничения. Некоторые ограничения обсуждались ранее: скрытый импорт и относительный импорт в сценариях точек входа.

PyInstaller поддерживает создание исполняемых файлов для Windows, Linux и macOS, но не может выполнять перекрестную компиляцию. Таким образом, вы не можете создать исполняемый файл, предназначенный для одной операционной системы, из другой операционной системы. Итак, чтобы распространять исполняемые файлы для нескольких типов ОС, вам понадобится машина сборки для каждой поддерживаемой ОС.

В связи с ограничением перекрестной компиляции полезно знать, что PyInstaller технически не объединяет абсолютно все, что необходимо для запуска вашего приложения. Ваш исполняемый файл по-прежнему зависит от пользователей .glibc Как правило, вы можете обойти это glibc ограничение, используя самую старую версию каждой ОС, на которую вы собираетесь ориентироваться.

Например, если вы хотите ориентироваться на широкий спектр машин Linux, вы можете использовать более старую версию CentOS. Это обеспечит вам совместимость с большинством версий, более новых, чем та, на которой вы строите. Это та же стратегия, описанная в PEP 0513, и это то, что PyPA рекомендует для создания совместимых колес.

На самом деле, вы, возможно, захотите изучить использование образа PyPA manylinux docker для вашей среды сборки Linux. Вы можете начать с базового образа, затем установить PyInstaller вместе со всеми вашими зависимостями и создать образ сборки, который поддерживает большинство вариантов Linux.

Вывод

PyInstaller может помочь сделать ненужными сложные установочные документы. Вместо этого ваши пользователи могут просто запустить ваш исполняемый файл, чтобы начать работу как можно быстрее. Рабочий процесс PyInstaller можно подытожить, выполнив следующие действия:

  1. Создайте сценарий точки входа, который вызывает вашу основную функцию.
  2. Установите PyInstaller.
  3. Запустите PyInstaller в вашей точке входа.
  4. Протестируйте свой новый исполняемый файл.
  5. Отправьте полученную dist/папку пользователям.

Вашим пользователям не обязательно знать, какую версию Python вы использовали или что ваше приложение вообще использует Python!