Кроме того, компиляторы MinGW и Visual C++ не полностью похожи друг на друга, поэтому вы должны проверить, работают ли ваши юнит-тесты так, как вы того ожидаете, после использования другого компилятора. Мы начинаем отходить от основной темы, поэтому проигнорируйте все, что здесь написано, если вы нечасто компилируете код C для Windows, но, например, все еще могут возникнуть кое-какие проблемы при использовании MinGW и NumPy ( https://github.com/numpy/numpy/issues/5479). В «Википедии» для NumPy есть статья ( https://github.com/numpy/numpy/wiki/Mingw-static-toolchain), в которой рекомендуется применять сборки MinGW со статическими наборами инструментов.
Мы сравним популярные инструменты для заморозки в табл. 6.1. Все они взаимодействуют со стандартной библиотекой Python. Они не могут выполнять кросс-платформенную заморозку [79] Заморозка кода Python на Linux с его преобразованием для выполнения в ОС Windows применялась в PyInstaller 1.4, но от этой возможности отказались в версии 1.5 ( https://github.com/pyinstaller/pyinstaller/wiki/FAQ#features ), поскольку она работала только для программ, написанных на чистом Python (то есть не для графических приложений).
, поэтому вы должны проводить сборки на целевых платформах.
Инструменты перечислены в том порядке, в каком описаны в этом разделе. PyInstaller и cx_Freeze могут использоваться на всех платформах, py2app работает только для OS X, py2exe — только для Windows, а bbFreeze может работать на UNIX-подобных системах и для Windows, но не для OS X (он еще не портирован на Python 3). Он может генерировать архивы egg, если вам нужна такая функциональность для вашей легаси-системы.
Таблица 6.1.Инструменты для заморозки
\ |
pyInstaller |
cx_Freeze |
py2app |
py2exe |
bbFreeze |
Python 3 |
Да |
Да |
Да |
Да |
— |
Лицензия |
Модифицированная GPL |
Модифицированная PSF |
MIT |
MIT |
Zlib |
Windows |
Да |
Да |
— |
— |
Да |
Linux |
Да |
Да |
— |
— |
Да |
OS X |
Да |
Да |
Да |
— |
— |
Eggs |
Да |
Да |
Да |
— |
Да |
Поддержка pkg_resources* |
— |
— |
Да |
— |
Да |
Режим одного файла** |
Да |
— |
— |
Да |
— |
* pkg_resources ( https://pythonhosted.org/setuptools/pkg_resources.html) — это отдельный модуль, поставляющийся с Setuptools, который может использоваться для автоматического поиска зависимостей. При заморозке кода возникают трудности, поскольку сложно вручную находить динамически загруженные зависимости статического кода. PyInstaller, например, только говорит о том, что все будет хорошо, когда анализ проводится для egg-архива.
** Режим одного файла — это способ размещения пакетов приложения и всех его зависимостей в едином исполняемом файле в ОС Windows. InnoSetup ( http://www.jrsoftware.org/isinfo.php) и Nullsoft Scriptable Install System (NSIS) ( http://nsis.sourceforge.net/Main_Page) — это популярные инструменты для создания установщиков, которые могут объединять код в единый файл с расширением. exe.
PyInstaller ( http://www.pyinstaller.org/) может быть использован для создания приложений для OS X, Windows и Linux. Его основное предназначение — быть совместимым со сторонними пакетами после установки, поэтому заморозка сразу работает [80] Как мы увидим при взгляде на другие установщики, сложность заключается не в поиске и объединении в пакеты совместимых библиотек, написанных на C, необходимых для определенной версии библиотеки Python, а в обнаружении периферических файлов конфигурации, спрайтов или особой графики, а также других файлов, которые не обнаруживает инструмент для заморозки при исследовании вашего исходного кода.
. По адресу https://github.com/pyinstaller/pyinstaller/wiki/Supported-Packagesперечислены пакеты, поддерживаемые PyInstaller. Список поддерживаемых графических библиотек содержит Pillow, pygame, PyOpenGL, PyGTK, PyQT4, PyQT5, PySide (за исключением надстроек для Qt) и wxPython. Поддерживаются также инструменты NumPy, Matplotlib, Pandas и SciPy.
PyInstaller имеет модифицированную лицензию GPL ( https://github.com/pyinstaller/pyinstaller/wiki/License) «с особым исключением, которое позволяет [всем] использовать PyInstaller для сборки и распространения небесплатных программ (включая коммерческие)», поэтому лицензии, которым вы должны подчиняться, будут зависеть от используемых вами при разработке кода библиотек. Команда разработчиков PyInstaller даже предоставляет инструкции, как спрятать исходный код ( http://bit.ly/hiding-source-code), для тех, кто создает коммерческие приложения или хочет, чтобы никто не изменял их код. Обязательно прочтите текст лицензии (проконсультируйтесь с адвокатом, если это важно, или воспользуйтесь ресурсом https://tldrlegal.com/, если это неважно), если вам нужно модифицировать их исходный код для того, чтобы создать собственное приложение, поскольку вам, возможно, придется поделиться изменениями.
Читать дальше