1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
|
=======================
|project| & PyInstaller
=======================
`PyInstaller <https://www.pyinstaller.org/>`_ allows you to freeze your python
application into a stand-alone executable.
The supported platforms are Linux, macOS, Windows, FreeBSD, and others.
One of the main goals of `PyInstaller` is to be compatible with 3rd-party
Python modules, e.g.: |pymodname|.
You can read the `official documentation <https://www.pyinstaller.org/documentation.html>`_
to clarify any further question, and remember to contribute to
`the project <https://github.com/pyinstaller/pyinstaller>`_
by filing issues if you find any, or contributing to their development.
Preparation
===========
Installing `PyInstaller` can be done via **pip**::
pip install pyinstaller
If you are using a virtual environment, remember to activate it before
installing `PyInstaller` into it.
After the installation, the `pyinstaller` binary will be located in the `bin/`
directory of your virtual environment, or where your Python executable is located.
If that directory is not in your `PATH`, you need to include the whole path
when executing `pyinstaller`.
.. warning:: If you already have PySide2 or Shiboken2 installed in your system, PyInstaller will pick them
instead of your virtual environment ones.
Freezing an application
=======================
`PyInstaller` has many options that you can use.
To learn more about them you can just run `pyinstaller -h`.
Two main features are the option to package the whole project
(including the shared libraries) into one executable file (`--onefile`),
and to prepare a directory that will contain
an executable next to all the used libraries.
Additionally, for Windows you can enable opening a console during the
execution with the option `-c` (or equivalent `--console` or `--nowindowed`).
Further, you can specify to not open such console window
on macOS and Windows with the option `-w` (or equivalent `--windowed` or `--noconsole`).
Creating an example
-------------------
Now, consider the following simple script, named `hello.py`::
import sys
import random
from PySide2.QtWidgets import (QApplication, QLabel, QPushButton,
QVBoxLayout, QWidget)
from PySide2.QtCore import Slot, Qt
class MyWidget(QWidget):
def __init__(self):
QWidget.__init__(self)
self.hello = ["Hallo Welt", "你好,世界", "Hei maailma",
"Hola Mundo", "Привет мир"]
self.button = QPushButton("Click me!")
self.text = QLabel("Hello World")
self.text.setAlignment(Qt.AlignCenter)
self.layout = QVBoxLayout()
self.layout.addWidget(self.text)
self.layout.addWidget(self.button)
self.setLayout(self.layout)
# Connecting the signal
self.button.clicked.connect(self.magic)
@Slot()
def magic(self):
self.text.setText(random.choice(self.hello))
if __name__ == "__main__":
app = QApplication(sys.argv)
widget = MyWidget()
widget.resize(800, 600)
widget.show()
sys.exit(app.exec_())
Since it has a UI, we will use the `--windowed` option.
The command line to proceed will look like this::
pyinstaller --name="MyApplication" --windowed hello.py
This process will create a `dist/` and `build/` directory.
The executable and all the shared libraries required by your application
will be placed inside `dist/MyApplication`.
To execute the frozen application you can go inside `dist/MyApplication` and
execute the program::
cd dist/MyApplication/
./MyApplication
.. note:: The directory inside `dist/` and the executable will have the same name.
If you prefer to have everything bundled into one executable, i.e.:
no shared libraries next to the executable, you can use the option
`--onefile`::
pyinstaller --name="MyApplication" --windowed --onefile hello.py
This process will take a bit longer, but in the end you will discover
an executable inside the `dist/` directory that you can execute::
cd dist/
./MyApplication
|