基本原理很简单, 就是依靠自带的 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
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.