
PEX 提供了内置环境变量 PEX,其值为当前运行的 .pex 文件的绝对路径,无需解析 __file__ 或 sys.argv,即可可靠、简洁地获取原始打包文件名与位置。
pex 提供了内置环境变量 pex,其值为当前运行的 .pex 文件的绝对路径,无需解析 __file__ 或 sys.argv,即可可靠、简洁地获取原始打包文件名与位置。
在 PEX 打包的应用中,__file__ 指向的是解压后临时目录中的可执行入口(如 __pex_executable__.py),而 sys.argv[0] 通常也指向该临时路径或符号链接,均无法反映原始 .pex 文件的真实路径。直接依赖这些值会导致路径误判,尤其在调试、日志记录、资源定位或自更新等场景下可能引发严重问题。
幸运的是,PEX 运行时会自动注入一个关键环境变量:PEX。该变量由 PEX 解释器在启动时设置,其值为用户实际执行的 .pex 文件的绝对路径(例如 /tmp/test.pex),稳定、可信且跨平台兼容。
✅ 正确做法如下:
import os
pex_path = os.environ.get("PEX")
if pex_path:
print(f"当前执行的 PEX 文件: {pex_path}")
print(f"文件名: {os.path.basename(pex_path)}")
print(f"所在目录: {os.path.dirname(pex_path)}")
else:
raise RuntimeError("未检测到 PEX 环境变量 — 当前可能未以 PEX 方式运行")
⚠️ 注意事项:
-
os.environ["PEX"]在非 PEX 环境(如直接用python test.py运行)下不存在,务必使用.get("PEX")并做空值检查; - 该变量在所有 PEX 版本(≥1.0)中均受支持,无需额外配置;
- 即使启用
--unzip、--no-unzip或使用--venv模式,PEX变量始终指向原始.pex文件路径; - 若需兼容性兜底(极少数定制化运行场景),可结合
sys.argv[0]向上追溯,但PEX是首选且唯一推荐的标准方式。
总结:要可靠获取执行中的 .pex 文件名与路径,请始终优先读取 os.environ["PEX"] —— 这是 PEX 工具链原生提供的、语义明确、行为确定的权威来源。










