Zip and ship, make an executable zipfile of your py project

Bob, Sun 25 December 2016, Packages

distribute, packaging, pip, zip

Get started

First of all, new in version 3.5 is zipapp which makes this easier. As not everybody is on this version yet, I will show the manual way to do this.

We're going to use the code of our last post: Get a weekly digest from a Pelican blog.

Step by step

OK here we go:

$ git clone zip-example
Cloning into 'zip-example'...
remote: Counting objects: 22, done.
remote: Compressing objects: 100% (14/14), done.
remote: Total 22 (delta 4), reused 22 (delta 4), pack-reused 0
Unpacking objects: 100% (22/22), done.
Checking connectivity... done.

$ cd zip-example/pybites_digest/
$ mkdir archive && cd $_
$ cp ../

# Note that where I say python3 and pip3 for you it might be python and pip

$ pip3 install -r ../requirements.txt --target=packages
Collecting feedparser==5.2.1 (from -r ../requirements.txt (line 1))
Installing collected packages: feedparser
Successfully installed feedparser-5.2.1

$ touch packages/
$ ls *
packages:         <dependencies>

# edit the main script to use the locally installed package (doing 'in place' edit)
$ perl -pi -e 's/import feedparser/import packages.feedparser as feedparser/g'

# zip it up
$ zip -r *
adding: (deflated 55%)
adding: packages/ (stored 0%)
adding: packages/ (stored 0%)
adding: packages/__pycache__/ (stored 0%)
adding: packages/__pycache__/feedparser.cpython-35.pyc (deflated 59%)
adding: packages/feedparser-5.2.1.dist-info/ (stored 0%)
adding: packages/feedparser-5.2.1.dist-info/DESCRIPTION.rst (stored 0%)
adding: packages/feedparser-5.2.1.dist-info/INSTALLER (stored 0%)
adding: packages/feedparser-5.2.1.dist-info/METADATA (deflated 64%)
adding: packages/feedparser-5.2.1.dist-info/metadata.json (deflated 58%)
adding: packages/feedparser-5.2.1.dist-info/RECORD (deflated 40%)
adding: packages/feedparser-5.2.1.dist-info/top_level.txt (stored 0%)
adding: packages/feedparser-5.2.1.dist-info/WHEEL (stored 0%)
adding: packages/ (deflated 74%)

$ echo '#!/usr/bin/env python3' > my_script
$ cat >> my_script
$ chmod ug+x my_script

# to prove it shows the feedparser package is not installed in my main py3 installation
$ python3
Python 3.5.1 |Anaconda 4.0.0 (x86_64)| (default, Dec  7 2015, 11:24:55) 
[GCC 4.2.1 (Apple Inc. build 5577)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import feedparser
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named 'feedparser'

# yet it works with the zipped package :)
$ ./my_script 
Get a weekly digest from a Pelican blog
In this post a script we use to get a weekly digest of our posts.

2016 py articles and useful books
Some of my Python articles I posted on my blog this year and useful books

# I can put it in my $HOME/bin now as well:

$ cp my_script ~/bin/pybites_digest
$ which pybites_digest
$ pybites_digest
Zip and ship, make an executable zipfile of your py project
In this post I show an example how you can distribute your code as an executable zipfile, a neat trick I discovered in Chapter 6 of The Hitchhiker's Guide to Python


Although I would not use this for bigger projects (you lose debugging abilities), this is still a neat way to package up and ship scripts. Consumers don't have to worry about installing dependencies / doing any pre-work.

PyBites Python Tips

Do you want to get 250+ concise and applicable Python tips in an ebook that will cost you less than 10 bucks (future updates included), check it out here.

Get our Python Tips Book

"The discussions are succinct yet thorough enough to give you a solid grasp of the particular problem. I just wish I would have had this book when I started learning Python." - Daniel H

"Bob and Julian are the masters at aggregating these small snippets of code that can really make certain aspects of coding easier." - Jesse B

"This is now my favourite first Python go-to reference." - Anthony L

"Do you ever go on one of those cooking websites for a recipe and have to scroll for what feels like an eternity to get to the ingredients and the 4 steps the recipe actually takes? This is the opposite of that." - Sergio S

Get the book