基于 zipapp 和 zipimport 做了一个用来发布/部署 Python 代码的小工具

2021-04-29 00:09:55 +08:00
 ClericPy

原理

基本原理很简单, 就是依靠自带的 zipappzipimport 能力, 把 Python 包或者单个 .py 文件连同依赖打包到一个 zip 里面去, 运行的时候自动挂载 sys.path 从而动态添加依赖. 整个代码纯 Python 写的, 也没依赖什么库, 逻辑比较简单

起因

起因也挺简单的, 因为 Hadoop Streaming 要使用打包好的有依赖的 Python 脚本, 用了两个多月 shiv 以后, 由于一些问题不容易解决, 所以动手做了个类似的, 主要问题是:

  1. 不能在打包时候设置默认 SHIV_ROOT(提过 issue 以后目前支持上了)
  2. 每次重新打包以后要重新创建缓存(有别人提了 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

1544 次点击
所在节点    Python
1 条回复
ClericPy
2021-04-29 00:22:31 +08:00
简单解释下参数意思:

-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

前几天收到陌生人感谢, 所以感觉应该也会有人用得上, 分享给大家.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/773958

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX