在pex文件中选择自定义python环境/版本

问题描述

在我的环境中,我有python 3.8.5pex 2.1.20 我使用以下命令将一些库捆绑在pex文件中:

pex module1 module2 module3 -o custom_env.pex

原因是我想在另一个机器上传输此pex文件,然后使用命令./custom_env.pex python_script.py运行Python脚本,以便为其提供所有必需的依赖项。

问题是在该机器/usr/bin/env python3.8上运行时,pex当前正在使用python 2.6.6。因此,当我运行pex文件时,会收到错误消息

/usr/bin/env: python3.8: No such file or directory

如何构建pex文件,使其与目标python环境匹配?

解决方法

对上述问题的评论已经警告了 Python 2 和 Python 3 之间的不兼容。

可以使用 --python 命令的 pex 选项控制生成的 PEX 文件的解释器兼容性(请参阅 Invoking the PEX utility)。例如,命令 pex --python=python3.6 -o py36.pex 将创建一个可以使用 Python 3.6 运行的 PEX 文件。结果 PEX 文件的 Shebang 将是 #!/usr/bin/env python3.6

PEX 还能够在单个 PEX 可执行文件中支持多个 Python 版本甚至多个平台。您可以通过使用不同的值多次为 PEX 命令指定 --python--platform 选项来实现此目的。

请注意,PEX 使用 Pip 来解决依赖关系。在指定 --python--platform 选项时,Pip 要求您的所有依赖项都可用作目标平台和 Python 版本的二进制轮。如果任何依赖项仅作为源 tarball 可用,则 Pip 的依赖项解析将失败。