PEX:把 Python 环境和代码打包成一个文件
PEX:把 Python 环境和代码打包成一个文件
pantsbuild/pex 在 GitHub 上拿到了 4,217 个 Star。
PEX 解决的问题很具体:把 Python 应用和它的依赖打包成一个可执行文件。这个文件叫 .pex(Python EXecutable),拿到任何机器上都能直接跑,不需要预先装环境。PEX 本身也是用 Python 写的,pip install 就能装。
1、这东西解决了什么问题
Python 部署一直有个尴尬的地方。你在本地跑得好好的,换台机器就炸。缺依赖、Python 版本不对、系统库没装。venv 能解决一部分,但你要把整个虚拟环境搬过去,或者靠 requirements.txt 现场装。要是目标机器没联网,现场装这条路也堵死了。
PEX 的思路是把一切都塞进一个文件。应用代码、依赖包、甚至针对不同平台的二进制扩展,全部打包进 .pex。部署变成 cp 命令的事。复制过去,直接执行。
这个思路参考了 PEP 441 的设计。PEX 不是第一个做打包的,但它把这件事做到了够简单。生成的文件自带 shebang,操作系统直接把它当可执行文件处理。你不需要知道里面是 zip 包还是什么格式,跑就完了。
PEX 文件本质上是一个 zip 包,前面加了一段 Python 启动脚本。操作系统执行它时,启动脚本负责解包、设置环境、调用入口函数。整个过程对用户透明。

2、怎么用
安装就是一条命令:
pip install pex
最直接的用法,启动一个带着 requests 和 flask 的 Python 解释器:
$ pex requests flask 'psutil>2,<3'
把自己当前环境的依赖冻结下来,打包带走:
$ pex $(pip freeze) -o my_virtualenv.pex
$ deactivate
$ ./my_virtualenv.pex
跑一个 Web 服务试试:
$ pex flask -- webserver.py
这些命令执行完,你拿到的是一个单文件。不需要装依赖,不需要配环境,复制到目标机器上直接跑。
如果你有 requirements.txt,也可以直接喂给 PEX:
$ pex -r requirements.txt -o app.pex
3、深入一点
PEX 支持指定入口点。如果一个项目配了 console_scripts,可以直接把它打成可执行文件:
$ pex "pex>=2.1.35" --console-script pex-tools --output-file pex-tools-executable.pex
也支持指定解释器类型,比如用 PyPy 来跑:
$ pex "pex>=2.1.35" -c pex-tools --python=pypy -o pex-tools-pypy-executable.pex
跨平台是另一个特点。一个 pex 文件可以同时包含 Linux 和 macOS 的二进制依赖,一份文件多处通用。你不需要为每个平台单独打一个包。
PEX 被设计成工具链的一环。Pants、Buck、pygradle 这些构建系统都原生支持生成 .pex 文件。CI 里打完包,分发到各台机器,一致性有保障。配合不同 Python 版本使用也很方便,–python 参数可以指定解释器路径。
PEX 还提供了 Python API,可以在代码里直接调用:
import pex
pex_args = ['requests', 'flask', '-o', 'my_app.pex']
pex.main(pex_args)

4、适合谁
如果你在维护 Python 应用,需要频繁部署到不同机器,PEX 能省掉不少重复劳动。CI/CD 流程里,把构建产物变成一个单文件,分发和回滚都简单。
如果你是工具开发者,想把 Python 工具分发给不会配环境的人,PEX 也是个方案。build 出一个 .pex,对方下载就能用,不需要知道背后有 Python。
如果你只是厌倦了每次换机器都要折腾 venv,也值得试试。PEX 的项目文档很全,社区也在维护。安装完就能上手,从最简单的命令开始,逐步深入。
项目基于 Apache 2.0 协议开源,源码在 GitHub 上可以找到。文档站 docs.pex-tool.org 覆盖了从入门到高级用法的全部内容。
的命令开始,逐步深入。
项目基于 Apache 2.0 协议开源,源码在 GitHub 上可以找到。文档站 docs.pex-tool.org 覆盖了从入门到高级用法的全部内容。
更多推荐
所有评论(0)