Being fairly new to python I only recently discovered the ability to directly execute a .zip file by placing a __main__.py
file at the top of the file. This works great for python code, but can I bundle other types of files and access them with my scripts? If so, how?
My ultimate goal would be to bundle some image files along with the python code in a single .zip file, then be able to use those images within the app without having to extract them to disk. I also would like to bundle a copyright notice, release notes, etc so that the entire app and its data files is in a single zip that can be executed without having to extract it somewhere.
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