PEX:把 Python 环境和代码打包成一个文件
文章目录PEX把 Python 环境和代码打包成一个文件1、这东西解决了什么问题2、怎么用3、深入一点4、适合谁PEX把 Python 环境和代码打包成一个文件pantsbuild/pex 在 GitHub 上拿到了 4,217 个 Star。PEX 解决的问题很具体把 Python 应用和它的依赖打包成一个可执行文件。这个文件叫 .pexPython EXecutable拿到任何机器上都能直接跑不需要预先装环境。PEX 本身也是用 Python 写的pip install 就能装。1、这东西解决了什么问题Python 部署一直有个尴尬的地方。你在本地跑得好好的换台机器就炸。缺依赖、Python 版本不对、系统库没装。venv 能解决一部分但你要把整个虚拟环境搬过去或者靠 requirements.txt 现场装。要是目标机器没联网现场装这条路也堵死了。PEX 的思路是把一切都塞进一个文件。应用代码、依赖包、甚至针对不同平台的二进制扩展全部打包进 .pex。部署变成 cp 命令的事。复制过去直接执行。这个思路参考了 PEP 441 的设计。PEX 不是第一个做打包的但它把这件事做到了够简单。生成的文件自带 shebang操作系统直接把它当可执行文件处理。你不需要知道里面是 zip 包还是什么格式跑就完了。PEX 文件本质上是一个 zip 包前面加了一段 Python 启动脚本。操作系统执行它时启动脚本负责解包、设置环境、调用入口函数。整个过程对用户透明。2、怎么用安装就是一条命令pipinstallpex最直接的用法启动一个带着 requests 和 flask 的 Python 解释器$ pex requests flaskpsutil2,3把自己当前环境的依赖冻结下来打包带走$ pex$(pip freeze)-omy_virtualenv.pex $ deactivate $ ./my_virtualenv.pex跑一个 Web 服务试试$ pex flask -- webserver.py这些命令执行完你拿到的是一个单文件。不需要装依赖不需要配环境复制到目标机器上直接跑。如果你有 requirements.txt也可以直接喂给 PEX$ pex-rrequirements.txt-oapp.pex3、深入一点PEX 支持指定入口点。如果一个项目配了 console_scripts可以直接把它打成可执行文件$ pexpex2.1.35--console-script pex-tools --output-file pex-tools-executable.pex也支持指定解释器类型比如用 PyPy 来跑$ pexpex2.1.35-cpex-tools--pythonpypy-opex-tools-pypy-executable.pex跨平台是另一个特点。一个 pex 文件可以同时包含 Linux 和 macOS 的二进制依赖一份文件多处通用。你不需要为每个平台单独打一个包。PEX 被设计成工具链的一环。Pants、Buck、pygradle 这些构建系统都原生支持生成 .pex 文件。CI 里打完包分发到各台机器一致性有保障。配合不同 Python 版本使用也很方便–python 参数可以指定解释器路径。PEX 还提供了 Python API可以在代码里直接调用importpex 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 覆盖了从入门到高级用法的全部内容。