[Python-Dev] Add a -z interpreter flag to execute a zip file

Andy C andychup at gmail.com
Thu Jul 12 08:46:27 CEST 2007


On 7/11/07, "Martin v. Löwis" <martin at v.loewis.de> wrote:
> > Nick Coghlan has reviewed the patch and seems to think it's a good
> > idea.  Thomas Wouters also said he likes it, and I ran it by Guido
> > earlier and he seemed to think the idea is good, although I don't
> > think he has seen the implementation.
>
> See my comment: I must be missing the point of the patch, since
> I can do the same thing (make a single executable zip file on
> Linux) through a /bin/sh header just fine.

Right, but it's supposed to be cross platform, as mentioned in the
patch.  This will work on Windows.  The main problem I see is that a
shell script in front of a zip file seems like a relatively common
idiom that people use and have different variants on, each of which
have their own idiosyncrasies.  So it would nice to consolidate them
and make it standard and robust.

For example, it looks like eggs have an executable format that is
similar to this.  And see the bug I mentioned where those executable
eggs can't be invoked through a symlink (which to me is a relatively
severe problem).  I think this has to do with some introspection on
$0, but you won't run into that with this implementation.

Also, I mentioned the program called autopar we use at Google that
does the same thing, and it also have a significant number of weird
hacks in the shell header.  I think Thomas Wouters has also worked on
another program to make an executable zip file.

Another example is that the behavior of the zip in your example
depends on what else is in the current directory [1], which isn't
desirable.  Nick pointed out this issue and I addressed it in the
patch by removing "" from sys.path, since the -c flag adds that.  If
lots of people reinvent this wheel (and they have), there are going to
be other subtleties like this that will be missed.

The -z flag also eliminates starting an extra process -- you invoke
the Python interpreter directly instead of starting a shell which in
turn invokes the Python interpreter.

As mentioned, it's also a very tiny amount of code, and I don't see
much potential for bad interactions with other things, the way I've
written it.

Andy

1)
andychu test2$ ./foo_exe.zip
Traceback (most recent call last):
  File "<string>", line 1, in ?
  File "foo.py", line 16, in ?
    import outside
ImportError: No module named outside

andychu test2$ touch outside.py

andychu test2$ ./foo_exe.zip
main

andychu test2$


More information about the Python-Dev mailing list