A while ago I made
the decision to move to Ubuntu Linux at the PC that I use at the
office as well as the computer that I use at home. To me a Linux
environment is more appealing. Although I've used Windows for a very
long time I'm very attracted to the freedom that I have in Linux and
that's why I started to clean up my Windows devices to be able to
make a smooth transition to the new operating system. Recently I
started with finishing some unfinished projects. Some of them can
only run or Windows or take too much time to set up within the new
Linux environment. So the easiest way was to finish them. One of this
projects was a small experiment with Python freezing tools to find
out how well Nuitka was able to freeze packages.
Freezing is an
interesting process which allows you to distribute your Python based
apps to other users. What you basically do during a freezing process
is grabbing all the Python code and the related dependencies and you
place them in a single place together with a Python interpreter. In
this way the users can run your app.
During my experiment
I played with two packages which allow you to freeze a Python
project: Nuitka and cx_Freeze. The last one is a very well known tool
to me. cx_Freeze allowed me to package a production grade app without
problems. Although the configuration can be a little bit frustrating
because the documentation lacks some examples it is a very reliable
package. I would advice it to everybody who wants to freeze Python
3.x apps.
The second freezing
tool is Nuitka. It's a Python compiler which compiles every construct
of Python to C++. The parts that can't be compiled to C++ are
executed by the default Python interpreter (libpython). This is done
in a very compatible manner. This means it speeds up some parts of
your application without breaking it. A nice addition to the compiler
is that it can create standalone packages just like cx_Freeze and
similar packages like py2exe and Pyinstaller.
During my experiment
I've frozen 2 small “Hello World!” applications: One CLI
application and one GUI application based on Qt (PySide).
During the
experiment I've found out that both packages are able to freeze the
applications without problems. The main advantage of Nuitka was that
it created a (signable) file without a library zip file which makes it less easy
for people to decompile the application. It seems like Nuitka is
promising because of it's performance gains and the highly compatible
standalone feature. However there is still work to be done and the
author needs some help in this.
At my project GitHub page you can check out the two examples. Hopefully it
can help you out if you want to freeze one of your Python
applications using one of these tools. I've tested it on a Windows
8.1 machine, but I'm quite sure that it will also work on other platforms.
Because I want to
focus more on web development I'll not continue actively with
experimenting with freezing tools. So this project is finished for
now. However I'll watch the freezing projects because there are quite
some interesting things going on like the updater package for Pyinstaller and I think projects like these can become a very nice
foundation for upcoming (desktop) apps written in Python.