基本原理很简单, 就是依靠自带的 zipapp
和 zipimport
能力, 把 Python 包或者单个 .py 文件连同依赖打包到一个 zip 里面去, 运行的时候自动挂载 sys.path
从而动态添加依赖. 整个代码纯 Python 写的, 也没依赖什么库, 逻辑比较简单
起因也挺简单的, 因为 Hadoop Streaming 要使用打包好的有依赖的 Python 脚本, 用了两个多月 shiv 以后, 由于一些问题不容易解决, 所以动手做了个类似的, 主要问题是:
SHIV_ROOT
(提过 issue 以后目前支持上了)build_id
的建议, 貌似没通过), 时间久了导致系统磁盘浪费好几个 GB第一版的时候是某个周日半夜突然来灵感(似乎只要是灵感必定来自洗澡)随手写的, 代码质量不太好有不少冗余代码, 不过功能用了两个多月目前大部分 bug 都 fix 了
不是推广, 就简单提供个
我有个朋友是我自己系列
的例子好了
假设你随手写了个依赖 requests 的爬虫脚本 script.py, 想发给你的朋友使用, 使用以下打包命令:
python3 -m zipapps -c -d -a script.py -m script -o myapp.py requests
这时候你朋友只需要在电脑上有 Python 解释器就可以直接执行 python3 myapp.py
, 第一次运行的话需要等待自动下载 requests
这个依赖. 如果不希望运行时候安装依赖, 把上面的 -d
参数去掉, 但是如果依赖里面有 C 语言实现的库或者一些需要编译的动态模组(比如 .so/.pyd), 要保证 Python 版本和系统版本对已经编译好的包可以共用, 否则会报错
写这东西初衷其实就是想在原有的发布手段之外, 尝试些新东西, 毕竟已经有太多: pyinstaller, venv, pipenv, poetry, setuptools, shiv, PyOxidizer 这些基本都用过, 但都太费事了
如果有兴趣的, 可以尝试一下: pip install -U zipapps
, 支持 python3.7+, 顺便帮忙发现一些 bug
1
ClericPy OP 简单解释下参数意思:
-c 就是压缩 -d 表示延迟安装, 去掉的话会提前安装并打包到一起 -a 表示要一起打包起来的目录或文件路径, 多个路径逗号隔开 -m 表示入口, 可以是: 1. 包名 2. 模块名 3. 包名.模块:函数 -o 表示输出的文件路径, 虽然是 .py, 实际是个 .zip 文件, 可以解压, 这里用 .py 是为了在 windows 上可以直接双击 requests 参数以及其他参数, 比如 `--user` / `-r requirement.txt` 这些会被追加到 `pip install `后面 其他文档参考: ClericPy/zipapps: Package your python code into a standalone file (with the requirements). - https://github.com/ClericPy/zipapps 前几天收到陌生人感谢, 所以感觉应该也会有人用得上, 分享给大家. |