1

是否可以使用环境变量在 python .pth 文件中指定库路径,如果可以,怎么做?

背景:我的 python 项目(位于 /path/to/my/project 中)在 virtualenv 中运行,但需要使用外部(但本地)包。不能选择将 virtualenv 与 --sytem-site-packages 一起使用,因此我按照此答案的建议通过 .pth 文件添加了外部包的路径。.pth 位于 /path/to/my/project/lib/python2.7/site-packages 中,仅包含以下行:

/path/to/external_dir/etc/python

这按预期工作,并允许我导入外部库。

为了在另一台计算机上使用我的项目,我想在路径中使用环境变量而不是绝对路径。我可以确定在python启动之前环境变量EXTERNAL_DIR设置如下:

export EXTERNAL_DIR="/path/to/external_dir"

但是,如果 .pth 文件中的 /path/to/external_dir 被替换为 ${EXTERNAL_DIR} 我会收到导入错误。.pth 文件的内容如下所示:

${EXTERNAL_DIR}/etc/python

这根本不是使用环境变量的正确方法,还是根本不可能在 .pth 文件中使用它们?

我正在使用 Debian、bash 和 python 2.7。

4

1 回答 1

1

我不相信可以按照您的建议直接在 .pth 文件中引用环境变量。请参阅site文档以了解这些文件的可接受格式(Python 23)。

可以根据需要使用环境变量,但是,使用此处提到的 .pth 文件的一个有趣属性:

执行以 import 开头的行(后跟空格或制表符)。

这种行为可以以聪明且可能危险的方式加以利用,让任意 Python 代码作为路径构造的一部分执行(有关此内容的更多信息,请参见 Graham Dumpleton 的优秀文章

要通过环境变量支持路径配置,请使用以下内容创建一个 .pth 文件:

import os, sys; dir = os.getenv('EXTERNAL_DIR'); dir and sys.path.append(dir)

这适用于 Python 2 和 3;这个import技巧只有在代码可以用一行表示时才有效。

如果定义了环境变量,此代码将附加EXTERNAL_DIRto的值,sys.path否则不执行任何操作。

# Create the .pth file.
$ echo "import os, sys; dir = os.getenv('EXTERNAL_DIR'); dir and sys.path.append(dir)" > /path/to/python/site-packages/extra.pth

# With no environment var, file does nothing:
$ python -c 'import sys; print(sys.path)[-1]'
/path/to/python/site-packages

# With environment variable, EXTERNAL_DIR gets added to end of path:
$ EXTERNAL_DIR=/foo/bar python -c 'import sys; print(sys.path)[-1]'
/foo/bar
于 2019-08-14T14:56:06.787 回答