14 comments

[ 2.9 ms ] story [ 55.8 ms ] thread
> Currently only supports OSX

Not sure how this is particularly useful then, since OSX ships with python 2.7. Something like this could be useful on Windows / Linux since they don't necessarily have a python installed, or if it was bundling 3.5.

Have you tried shipping a python application to end users while relying on the OS X system python? In my experience, this is an extremely painful process.

You would either need to do all of your development/testing with the system python or ensure that you're development environment is compatible with the system python (including stuff like distutils.util.get_platform(), https://github.com/MacPython/wiki/wiki/Spinning-wheels).

What do you do when Apple doesn't update their python with some patch you want?

Yes, I do this for my project.

Although, I do not attempt to install any libraries, I keep everything in the application bundle and set environment variables as needed.

It is limiting in the sense that I must use the Python version that Apple does but at the same time, the shipping executable is downright tiny compared to most Mac OS X applications.

Are you modifying sys.path() to load the dependencies that are shipped with the app; or some other technique?
I use the location of the script to find the absolute path to the bundle (MacOS folder), from which I can work backwards using ".." to find other things like bundled libraries.

In my case some of the libraries are also compiled so I have a starter script that sets DYLD_LIBRARY_PATH, PYTHONPATH, etc. and runs a 2nd script that can then successfully import whatever is required.

How is this different from py2app?
I initially tried using py2app/py2exe/cx_Freeze, but stuff kept crashing. They're trying to do something considerably more complicated than my 90 LOC bash script; namely trying to bundle your application, it's dependencies and the python interpreter into one package.

This bash script just gives you a python interpreter that should run on any system. From there, your install script can setup a virtualenv, grab dependencies and do whatever else.

I love the command in the readme for computing dependencies of arbitrary projects.
Another route is to compile via Cython with the interpreter embedded.

https://github.com/cython/cython/tree/master/Demos/embed

You could take your existing Python code and simply change the .py extension to .pyx and compile with the `--embed` option.

Of course, it requires compile dependence on Cython.

I wonder if Python can't support something like starkits/starpacks from the Tcl world ?

There's a somewhat similar Perl implementation but it extracts files to the real filesystem and executes them rather than just reading from a VFS.

That's basically what pyinstaller is. It's not quite the same (extracts files to the temp directory), but it's the same general idea.

A lot of Python applications on Windows are distributed this way.

How is this different from eGenix PyRun?