On Thu, May 28, 2015 at 11:38 AM, Paul Moore email@example.com wrote:
On 28 May 2015 at 16:58, Barry Warsaw firstname.lastname@example.org wrote:
On May 28, 2015, at 11:39 AM, Donald Stufft wrote:
You don’t need a "fully functioning Python" for a single file binary, you only need enough to actually run your application. For example, if you're making an application that can download files over HTTP, you don't need
include parts of the stdlib like xmlrpc, pickle, shelve, marshall,
csv, email, mailcap, mailbox, imaplib, nntplib, etc.
There are actually two related but different use cases to "single file executables".
The first is nicely solved by tools like pex, where you don't need to
a fully functional Python at the head of the zip file because the
you're deploying it into will have enough Python to make the zip work.
can certainly result in smaller zip files. This is the approach I took
Snappy Ubuntu Core support for Python 3, based on the current situation
the atomic upgrade client is written in Python 3. If that changes and
3 is removed from the image, then this approach won't work.
pex (and others) does a great job at this, so unless there are things
refactored into upstream Python, I don't think we need to do much here.
One problem with pex is that it doesn't appear to work on Windows (I just gave it a try, and got errors because it relies on symlinks).
IMO, any solution to "distributing Python applications" that is intended to compete with the idea that "go produces nice single-file executables" needs to be cross-platform. At the moment, zipapp (and in general, the core support for running applications from a zip file) handles this for the case where you're allowed to assume an already installed Python interpreter. The proviso here, as Donald pointed out, is that it doesn't handle C extensions.
The biggest problem with 3rd-party solutions is that they don't always support the full range of platforms that Python supports. That's fine for a 3rd party tool, but if we want to have a response to people asking how to bundle their application written in Python, we need a better answer than "if you're on Windows, use py2exe, or if you're on Unix use pex, or maybe..."
Python has core support for the equivalent of Java's jar format in zipapp. It's not well promoted (and doesn't support C extensions) but it's a pretty viable option for a lot of situations.
The second use case is as you describe: put a complete functional Python environment at the head of the zip file so you don't need anything in the target deployment environment. "Complete" can easily mean the entire
and although that would usually be more bloated than you normally need,
it's just some extra unused bits so who cares? <wink>. I think this
an excellent starting point which can be optimized to trim unnecessary
later, maybe by third party tools.
Tools like py2exe and cx_Freeze do this, and are pretty commonly used on Windows. An obvious example of use is Mercurial. If you're looking at this scenario, a good place to start would probably be understanding why cx_Freeze isn't more commonly used on Unix (AFAIK, it supports Unix, but I've only ever really heard of it being used on Windows).
* supports "py2exe, py2app, cxfreeze and bbfreeze" * builds a zip archive containing an .exe * manages (failed) [auto-]updates
* adds an executable header to a (topo-sorted?) ZIP file with a minimal path
* pipsi https://github.com/mitsuhiko/pipsi/blob/master/pipsi.py * installs packages with console_scripts into separate virtualenvs with minimal sys.paths and ~/.local/bin)
At the end of the day I still need packaging or configmgmt or NIX for checksums (a manifest wrapped around the executable wrapper).
I suspect "single file executables" just aren't viewed as a desirable solution on Unix. Although Donald referred to a 4K binary, which probably means just a stub exe that depends on system-installed .so files, likely including Python (I'm just guessing here). It's easy to do something similar on Windows, but it's *not* what most Windows users think of when you say a "single file executable for a Python program" (because there's no system package manager doing dependencies for you).
NuGet, Chocolatey, -> OneGet
It's a topologically sorted adjacency list + build + install + uninstall scripts.
Again, platform-specific answers are one thing, and are relatively common, but having a good cross-platform answer at the language level (a section on docs.python.org "How to ship your Python program") is much harder.
Of course deciding which pieces you include in the zip file you're
to the end of Python is up to whatever tool builds this executable which doesn't need to be part of Python itself. If Python itself gained the
to operate in that manner than third party tools could handle trying to
the optimizations where it only includes the things it actually needs in
stdlib and excludes things it doesn't. The key thing here is that since you're doing a single file binary, you don't need to have a Python which
suitable to execute random Python code, you only need one that is
execute this particular code so you can specialize what that includes.
I'd love to see Python itself gain such a tool, but if it had the
pieces to execute in this way, that would enable a common approach to supporting this in third party tools, on a variety of platforms.
Stripping out unused code is a hard problem in a language as dynamic as Python. It would be great to see it happen, but I'm not sure how much better we can do than existing tools like modulefinder. (consider that stripping out parts of the stdlib is the same in principle as stripping out unused bits of a 3rd party library like requests - when this issue comes up, people often talk about slimming down the stdlib to just what's needed, but why not take out the json support from requests if you don't use it?)
Is this what they do for AppEngine / AppScale Python?
I do think single-file executables are an important piece to Python's long-term competitiveness.
Agreed. But also, I think that "single-file" executables (single-directory, in practice) are *already* important - as I say, for projects like Mercurial. Doing better is great, but we could do worse than start by asking the Mercurial/TortoiseHg project and others what are the problems with the current situation that changes to the core could help to improve. I doubt "please make pythonXY.zip 50% smaller" would be the key issue :-)
"Select your platform" (According to User-Agent)