python: can executable zip files include data files?
At least on my Linux box there is no open filehandle or mapped memory by the process to its own zipfile, so presumably there is no way to "magically" access it.
However, creating your own access is not that hard. Create a __main__.py
like so:
import os, zipfile
me = zipfile.ZipFile(os.path.dirname(__file__), 'r')
f = me.open('other.txt')
print f.read()
f.close()
me.close()
Edit: Somewhat terse, that. For completeness:
$ echo "Hello ZIP" > other.txt
$ zip testo.zip __main__.py other.txt
$ python testo.zip
Hello ZIP
You could use pkg_resources
functions to access files:
# __main__.py
import pkg_resources
from PIL import Image
print pkg_resources.resource_string(__name__, 'README.txt')
im = Image.open(pkg_resources.resource_stream('app', 'im.png'))
im.rotate(45).show()
Where zipfile contains:
. |-- app | |-- im.png | `-- __init__.py |-- README.txt `-- __main__.py
To make zipfile executable, run:
$ echo '#!/usr/bin/env python' | cat - zipfile > program-name
$ chmod +x program-name
To test it:
$ cp program-name /another-dir/
$ cd /another-dir && ./program-name