Package your python code into one zip file, even a virtual environment.
Project description
zipapps
Zip python code like a jar package, and enjoy it. Package your code with requirements into a standalone zip file, even you can use it like a zipped virtual environment.
Depends on PEP441, which means it is also compatible for win32.
Inspired by shiv, to publish applications easily. Unlike shiv, this lib will not always create new cache folders while running.
Features
- Zip pure python code without cache folder while running.
- pure python code will not unzip anything by default.
- Zip files/folders by your choice, and unzip which you want.
- files/libs/folders will be unzip to
-up/--unzip-path, default is./%s_unzip_cachewhile running. - or you can reset a new path with environment variable
UNZIP_PATH- have a try:
python3 -m zipapps -u bottle -o bottle_env.pyz bottle&&set UNZIP_PATH=./tmp&&python3 bottle_env.pyz -c "import bottle;print('here is bottle unzip position:', bottle.__file__)"
- have a try:
- files/libs/folders will be unzip to
- Zip the dynamic modules (.pyd, .so) which
zipimportnot support.- package with
-ufor these libs.
- package with
- Reuse the unzip cache folder for the same zip timestamp.
zip-timestampwill play as abuild_id
- Use like a
venvor interpreter withpython3 ./env.pyz script.py, script.py will enjoy the PYTHONPATH of env.pyz.- package without
-marg, then run codes inPopen.
- package without
- Fix
psutilImportError of DLL loading.- package with
-ssto usePopeninstead of import directly.
- package with
- Support import
pyzas venv zip file.- activate auto-unzip by
import ensure_zipappsaftersys.path.append("app.pyz")- or active with accurate import
import ensure_zipapps_bottle_envwhile activating multiple environments.
- or active with accurate import
- view the example below for more infomation.
- activate auto-unzip by
- Support compile to
pycfor better performance.- activate compile by
--compileor-cc. - but
__pycache__folder in zip file will not work, - so you can unzip them by
--unzip=xxx, - to check whether
pycworked byimport bottle;print(bottle.__cached__)
- activate compile by
- Support
build_idto skip duplicate builds.- using like
python3 -m zipapps -b requirements.txt -r requirements.txt python3 -m zipapps --build-id=a.py,b.py -r requirements.txtpython3 -m zipapps --build-id=./*.py -r requirements.txtpython3 -m zipapps --build-id=efdd0a5584169cdf791 -r requirements.txtpython3 -m zipapps --build-id=version1.0 -r requirements.txt
- using like
Requirements
Only python3.6+, without any requirements.
Install
pip install zipapps -U
Usage
Normal usage
python3 -m zipapps -h
usage:
===========================================================================
0. package your code without any requirements
> python3 -m zipapps -c -a ./simple_package -p /usr/bin/python3 -o simple_package.pyz
> ./simple_package.pyz
OR
> python3 -m zipapps -c -a ./simple_package -o simple_package.pyz
> python3 simple_package.pyz
------------------------------------
1. use zipapps to make a standalone app which need bottle installed
> python3 -m zipapps -c -a bottle_server.py -m bottle_server:main bottle
> python3 app.pyz
OR
> python3 -m zipapps -c -a bottle_server.py -m bottle_server:main bottle
> python3 app.pyz
------------------------------------
2. use zipapps for venv
> python3 -m zipapps -c bottle
> python3 app.pyz bottle_server.py
OR
> python3 -m zipapps -c -p /usr/bin/python3 bottle
> ./app.pyz bottle_server.py
------------------------------------
3. advanced usages
3.1 more args
> python3 -m zipapps -c -a package1,package2 -o server.pyz -m package1.server:main -p /usr/bin/python3 -r requirements.txt
> ./server.pyz
3.2 unzip C-libs to cache folder for zipimport do not support .so .pyd files.
bad
> python3 -m zipapps -c lxml
> python3 app.pyz -c "import lxml.html;print(lxml.html.__file__)"
good
> python3 -m zipapps -c -u lxml lxml
> python3 app.pyz -c "import lxml.html;print(lxml.html.__file__)"
PS: all the unknown args will be used by "pip install".
===========================================================================
optional arguments:
-h, --help show this help message and exit
--version show program's version number and exit
--output OUTPUT, -o OUTPUT
The name of the output file, defaults to "app.pyz".
--python INTERPRETER, -p INTERPRETER
The name of the Python interpreter to use (default: no shebang line).
--main MAIN, -m MAIN The main function of the application. Format like package.module:function.
--compress, -c Compress files with the deflate method, defaults to uncompressed.
--includes INCLUDES, -a INCLUDES
The files/folders of given dir path will be copied into cache-path, which can be import from PYTHONPATH). The path string will be splited by ",".
--cache-path CACHE_PATH, --source-dir CACHE_PATH, -cp CACHE_PATH
The cache path of zipapps to store site-packages and `includes` files, which will be treat as PYTHONPATH. If not set, will create and clean-up automately.
--unzip UNZIP, -u UNZIP
The names which need to be unzip while running, name without ext. such as .so/.pyd files(which can not be loaded by zipimport), or packages with operations of
static files. If unzip is *, will unzip all files and folders.
--unzip-path UNZIP_PATH, -up UNZIP_PATH
The names which need to be unzip while running, name without ext. such as .so/.pyd files(which can not be loaded by zipimport), or packages with operations of
static files. Defaults to $(appname)_unzip_cache.
--shell, -s Only while `main` is not set, used for shell=True in subprocess.Popen.
--main-shell, -ss Only for `main` is not null, call `main` with subprocess.Popen: `python -c "import a.b;a.b.c()"`. This is used for `psutil` ImportError of DLL load.
--strict-python-path, -spp
Ignore global PYTHONPATH, only use app_unzip_cache and app.pyz.
-cc, --pyc, --compile, --compiled
Compile .py to .pyc for fast import, but zipapp does not work unless you unzip it.
-b BUILD_ID, --build-id BUILD_ID
a string to skip duplicate builds, it can be the paths of files/folders which splited by ",", then the modify time will be used as build_id. If build_id contains
`*`, will use `glob` function to get paths. For example, you can set requirements.txt as your build_id by `python3 -m zipapps -b requirements.txt -r
requirements.txt` when you use pyz as venv.
Using as the venv zip file
As you see,
import ensure_zipapps_bottle_envonly works for packaging with a non-nullunziparg.If you don't need to unzip any files/folders,
sys.path.append('app.pyz')is enough.
WARNING: multiple pyz files for venv, you need to ensure each file by special name like import ensure_zipapps_{file_name}(such as import ensure_zipapps_bottle) instead of import ensure_zipapps.
'''
zip env as usual:
python3 -m zipapps -u bottle -o bottle_env.pyz bottle
'''
import sys
# add `bottle_env.pyz` as import path
sys.path.append('bottle_env.pyz')
# now import bottle to see where it located
import bottle
print(bottle.__file__)
# yes, it's in the bottle_env.pyz: bottle_env.pyz/bottle.py
# now `import ensure_zipapps` to activate the unzip step
import ensure_zipapps_bottle_env
# reload bottle module to check if the location of bottle changed
import importlib
importlib.reload(bottle)
# now import bottle to see where it located
print(bottle.__file__)
# yes again, it changed to the unzip path: bottle_env_unzip_cache/bottle.py
FAQ
- How to zip apps with C-lib requirements for
zipimportingore.pyd,.sofiles?- as https://docs.python.org/3/library/zipimport.html
- we can unzip those packages in temp dirs with
-uargs -
python3 -m zipapps -c -u selectolax selectolax
-
python3 app.pyz xxx.py
- How to avoid unlimited unzip cachefolder size growth?
- There is a null file named like
zip-timein zip files and unzip folders - The same
zip-timecache with same name will not unzip again.
- There is a null file named like
PYTHONPATHbetween zipapps's zip file and global python environment?- If you set
-sppfor strictPYTHONPATH, you will not use the globalPYTHONPATH. - else you will use global libs as a second choice.
- If you set
- Where to Use it?
- Hadoop-Streaming's mapper & reducer.
- Simple deployment towards different servers with
jenkins, or other CI/CD tools. - Distribute zipapp with embedded python.
- Use as a requirements zip path.
import sys;sys.path.insert(0, 'app.pyz')(without .so/.pyd)python3 app.pyz script.py
- Other usages need to be found, and enjoy yourself.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file zipapps-2020.11.12-py3-none-any.whl.
File metadata
- Download URL: zipapps-2020.11.12-py3-none-any.whl
- Upload date:
- Size: 11.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/50.0.3 requests-toolbelt/0.9.1 tqdm/4.48.2 CPython/3.8.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
186fdcb97fde88bc53776f59c576293deecab8907ff40e7ca2ae0cd758a0c4ca
|
|
| MD5 |
e9ed1056c61059b7f5a99acb7c1a3109
|
|
| BLAKE2b-256 |
c28103bd9c2ec1177a218071b7d2e0bb04c866278e104f14d330b76453ae73c9
|