PyInstaller Manual¶
PyInstaller bundles a Python application and all its dependencies into a single package. The user can run the packaged app without installing a Python interpreter or any modules. PyInstaller supports Python 3.7 and newer, and correctly bundles many major Python packages such as numpy, matplotlib, PyQt, wxPython, and others.
PyInstaller is tested against Windows, MacOS X, and Linux. However, it is not a cross-compiler; to make a Windows app you run PyInstaller on Windows, and to make a Linux app you run it on Linux, etc. x PyInstaller has been used successfully with AIX, Solaris, FreeBSD and OpenBSD but testing against them is not part of our continuous integration tests, and the development team offers no guarantee (all code for these platforms comes from external contributions) that PyInstaller will work on these platforms or that they will continue to be supported.
Quickstart¶
Make sure you have the Requirements installed, and then install PyInstaller from PyPI:
pip install -U pyinstaller
Open a command prompt/shell window, and navigate to the directory where your .py file is located, then build your app with the following command:
pyinstaller your_program.py
Your bundled application should now be available in the dist folder.
Contents:¶
- Requirements
- Windows
- macOS
- GNU/Linux
- AIX, Solaris, FreeBSD and OpenBSD
- Some ideas how you can help
- Installing from the source archive
- Verifying the installation
- Installed commands
- Analysis: Finding the Files Your Program Needs
- Bundling to One Folder
- How the One-Folder Program Works
- Bundling to One File
- How the One-File Program Works
- Using a Console Window
- Hiding the Source Code
- Options
- Shortening the Command
- Running PyInstaller from Python code
- Using UPX
- Splash Screen (Experimental)
- The pyi_splash Module
- Defining the Extraction Location
- Supporting Multiple Platforms
- Capturing Windows Version Data
- Building macOS App Bundles
- Platform-specific Notes
- Using __file__
- Using sys.executable and sys.argv[0]
- LD_LIBRARY_PATH / LIBPATH considerations
- Spec File Operation
- Adding Files to the Bundle
- Giving Run-time Python Options
- Spec File Options for a macOS Bundle
- POSIX Specific Options
- The Splash Target
- Multipackage Bundles
- Globals Available to the Spec File
- Ctypes Dependencies
- SWIG support
- Cython support
- macOS multi-arch support
- macOS binary code signing
- macOS event forwarding and argv emulation in app bundles
- Signal handling in console Windows applications and onefile application cleanup
- Recipes and Examples for Specific Problems
- Finding out What Went Wrong
- Helping PyInstaller Find Modules
- Getting the Latest Version
- Asking for Help
- The Bootstrap Process in Detail
- pyi_splash Module (Detailed)
- The Table of Contents (TOC) lists and the Tree Class
- Inspecting Archives
- Inspecting Executables
- Creating a Reproducible Build
- How a Hook Is Loaded
- Providing PyInstaller Hooks with your Package
- Hook Global Variables
- Useful Items in PyInstaller.compat
- Useful Items in PyInstaller.utils.hooks
- Subprocess isolation with PyInstaller.isolated
- The hook(hook_api) Function
- The pre_find_module_path( pfmp_api ) Method
- The pre_safe_import_module( psim_api ) Method
- Supported hooks and options
- Adding an option to the hook
- Building for GNU/Linux
- Building for macOS
- Building for Windows
- Building for AIX
- Building for FreeBSD
- Vagrantfile Virtual Machines
- 5.13.0 (2023-06-24)
- 5.12.0 (2023-06-08)
- 5.11.0 (2023-05-13)
- 5.10.1 (2023-04-14)
- 5.10.0 (2023-04-11)
- 5.9.0 (2023-03-13)
- 5.8.0 (2023-02-11)
- 5.7.0 (2022-12-04)
- 5.6.2 (2022-10-31)
- 5.6.1 (2022-10-25)
- 5.6 (2022-10-23)
- 5.5 (2022-10-08)
- 5.4.1 (2022-09-11)
- 5.4 (2022-09-10)
- 5.3 (2022-07-30)
- 5.2 (2022-07-08)
- 5.1 (2022-05-17)
- 5.0.1 (2022-04-25)
- 5.0 (2022-04-15)
- 4.10 (2022-03-05)
- 4.9 (2022-02-03)
- 4.8 (2022-01-06)
- 4.7 (2021-11-10)
- 4.6 (2021-10-29)
- 4.5.1 (2021-08-06)
- 4.5 (2021-08-01)
- 4.4 (2021-07-13)
- 4.3 (2021-04-16)
- 4.2 (2021-01-13)
- 4.1 (2020-11-18)
- 4.0 (2020-08-08)
- Older Versions
- Contributions to PyInstaller 5.13.0
- Contributions to PyInstaller 5.12.0
- Contributions to PyInstaller 5.11.0
- Contributions to PyInstaller 5.10.1
- Contributions to PyInstaller 5.10.0
- Contributions to PyInstaller 5.9.0
- Contributions to PyInstaller 5.8.0
- Contributions to PyInstaller 5.7.0
- Contributions to PyInstaller 5.6.2
- Contributions to PyInstaller 5.6.1
- Contributions to PyInstaller 5.6
- Contributions to PyInstaller 5.5
- Contributions to PyInstaller 5.4.1
- Contributions to PyInstaller 5.4
- Contributions to PyInstaller 5.3
- Contributions to PyInstaller 5.2
- Contributions to PyInstaller 5.1
- Contributions to PyInstaller 5.0.1
- Contributions to PyInstaller 5.0
- Contributions to PyInstaller 4.10
- Contributions to PyInstaller 4.9
- Contributions to PyInstaller 4.8
- Contributions to PyInstaller 4.7
- Contributions to PyInstaller 4.6
- Contributions to PyInstaller 4.5.1
- Contributions to PyInstaller 4.5
- Contributions to PyInstaller 4.4
- Contributions to PyInstaller 4.3
- Contributions to PyInstaller 4.2
- Contributions to PyInstaller 4.1
- Contributions to PyInstaller 4.0
- Contributions to PyInstaller 3.6
- Contributions to PyInstaller 3.5
- Contributions to PyInstaller 3.4
- Contributions to PyInstaller 3.3.1
- Contributions to PyInstaller 3.3
- Contributions to PyInstaller 3.2.1
- Contributions to PyInstaller 3.2
- Contributions to PyInstaller 3.1.1
- Contributions to PyInstaller 3.1
- Contributions to PyInstaller 3.0
- Contributions to PyInstaller 2.1 and older
- pyinstaller
- pyi-makespec
- Quickstart
- New to GitHub or Git?
- Coding conventions
- Running the Test Suite
- Guidelines for Commits
- Improving and Building the Documentation
- Creating Pull-Requests
- Changelog Entries
- pyenv and PyInstaller
- PyInstaller’s Branch Model
Indices and tables¶
© Copyright This document has been placed in the public domain.. Revision 58b8235b .
Собираем проект на python3&PyQT5 под Windows, используя PyInstaller
Причиной написания статьи, явилось огромное количество постоянно возникающих у новичков вопросов такого содержания: «Как собрать проект c pyqt5», «Почему не работает», «Какой инструмент выбрать» и т.д. Сегодня научимся собирать проекты без мучений и танцев с бубном.
Как-то пришлось написать небольшое desktop-приложение. В качестве языка программирования для разработки был выбран python, поскольку для решения моей задачи он подходил идеально. В стандартную библиотеку Python уже входит библиотека tkinter, позволяющая создавать GUI. Но проблема tkinter в том, что данной библиотеке посвящено мало внимания, и найти в интернете курс, книгу или FAQ по ней довольно-таки сложно. Поэтому было решено использовать более мощную, современную и функциональную библиотеку Qt, которая имеет привязки к языку программирования python в виде библиотеки PyQT5. Более подробно про PyQT можете почитать здесь. В качестве примера я буду использовать код:
#!/usr/bin/python3 # -*- coding: utf-8 -*- import sys from PyQt5.QtWidgets import QApplication, QWidget from PyQt5.QtGui import QIcon class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setGeometry(300, 300, 300, 220) self.setWindowTitle('Icon') self.setWindowIcon(QIcon('web.png')) self.show() if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
Если вы более-менее опытный разработчик, то понимаете, что без интерпретатора код на python не запустить. А хотелось бы дать возможность каждому пользователю использовать программу. Вот здесь к нам на помощь и приходят специальные библиотеки позволяющие собирать проекты в .exe, которые можно потом без проблем запустить, как обычное приложение.
Существует большое количество библиотек, позволяющих это сделать, среди которых самые популярные: cx_Freeze, py2exe, nuitka, PyInstaller и др. Про каждую написано довольно много. Но надо сказать, что многие из этих решений позволяют запускать код только на компьютере, с предустановленным интерпретатором и pyqt5. Не думаю, что пользователь будет заморачиваться и ставить себе дополнительные пакеты и программы. Надеюсь, вы понимаете, что запуск программы на dev-среде и у пользователя это не одно и тоже. Также нужно отметить, что у каждого решения были свои проблемы: один не запускался, другой собирал то, что не смог потом запустить, третий вообще отказывался что-либо делать.
После долгих танцев с бубном и активным гуглением, мне все же удалось собрать проект с помощью pyinstaller, в полностью работоспособное приложение.
Немного о Pyinstaller
Pyinstaller собирает python-приложение и все зависимости в один пакет. Пользователь может запускать приложение без установки интерпретатора python или каких-либо модулей. Pyinstaller поддерживает python 2.7 и python 3.3+ и такие библиотеки как: numpy, PyQt, Django, wxPython и другие.
Pyinstaller тестировался на Windows, Mac OS X и Linux. Как бы там ни было, это не кросс-платформенный компилятор: чтобы сделать приложение под Windows, делай это на Windows; Чтобы сделать приложение под Linux, делай это на Linux и т.д.
PyInstaller успешно используется с AIX, Solaris и FreeBSD, но тестирование не проводилось.
Подробнее о PyInstaller можно почитать здесь: документация.
К тому же после сборки приложение весило всего около 15 мб. Это к слову и является преимуществом pyinstaller, поскольку он не собирает все подряд, а только необходимое. Аналогичные же библиотеки выдавали результат за 200-300 мб.
Приступаем к сборке
Прежде чем приступить к сборке мы должны установить необходимые библиотеки, а именно pywin32 и собственно pyinstaller:
pip install pypiwin32 pip install pyinstaller
Чтобы убедится, что все нормально установилось, вводим команду:
должна высветиться версия pyinstaller. Если все правильно установилось, идем дальше.
В папке с проектом запускаем cmd и набираем:
Собственно это и есть простейшая команда, которая соберет наш проект.
Синтаксис команды pyinstaller таков:pyinstaller [options] script [script . ] | specfile
Наиболее часто используемые опции:
—onefile — сборка в один файл, т.е. файлы .dll не пишутся.
—windowed -при запуске приложения, будет появляться консоль.
—noconsole — при запуске приложения, консоль появляться не будет.
—icon=app.ico — добавляем иконку в окно.
—paths — возможность вручную прописать путь к необходимым файлам, если pyinstaller
не может их найти(например: —paths D:\python35\Lib\site-packages\PyQt5\Qt\bin)PyInstaller анализирует файл myscript.py и делает следующее:
- Пишет файл myscript.spec в той же папке, где находится скрипт.
- Создает папку build в той же папке, где находится скрипт.
- Записывает некоторые логи и рабочие файлы в папку build.
- Создает папку dist в той же папке, где находится скрипт.
- Пишет исполняемый файл в папку dist.
В итоге наша команда будет выглядеть так:
pyinstaller --onefile --icon=name.ico --noconsole myscript.py
После работы программы вы найдете две папки: dist и build. Собственно в папке dist и находится наше приложение. Впоследствии папку build можно спокойно удалить, она не влияет на работоспособность приложения.
Спасибо за внимание. Надеюсь статья была вам полезна.