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.
A self-extracting Zip file is a Windows executable file (.exe). It will contain a Zip file and a small program to extract (unzip) the files in the Zip file. A user can run (execute) a self-extracting Zip file just as they run any other program: just double click on the .exe file.
Python can work directly with data in ZIP files. You can look at the list of items in the directory and work with the data files themselves. This recipe is a snippet that lists all of the names and content lengths of the files included in the ZIP archive zipfile.
To work on zip files using Python, we will use an inbuilt python module called zipfile. In Python's zipfile module, the ZipFile class provides a member function to extract all the ZIP archive contents.
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With