V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
ClericPy
V2EX  ›  Python

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

  •  
  •   ClericPy ·
    ClericPy · 2021-04-29 00:09:55 +08:00 · 1560 次点击
    这是一个创建于 1322 天前的主题,其中的信息可能已经有所发展或是发生改变。

    原理

    基本原理很简单, 就是依靠自带的 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

    第 1 条附言  ·  2021-05-15 22:14:08 +08:00
    1 条回复    2021-04-29 00:22:31 +08:00
    ClericPy
        1
    ClericPy  
    OP
       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

    前几天收到陌生人感谢, 所以感觉应该也会有人用得上, 分享给大家.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5003 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 09:05 · PVG 17:05 · LAX 01:05 · JFK 04:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.