使用环境变量将包路径添加到python .pth文件

时间:2017-12-17 01:24:13

标签: python python-2.7 environment-variables pth

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

背景:我的python项目(位于/ path / to / my / project中)运行在virtualenv中,但需要使用外部(但是本地)程序包。使用带有--sytem-site-packages的virtualenv不是一个选项,因此我根据this answer的建议通过.pth文件添加了外部包的路径。 .pth位于/path/to/my/project/lib/python2.7/site-packages中,仅包含以下行:

/path/to/external_dir/etc/python

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

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

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。

1 个答案:

答案 0 :(得分:0)

我认为您可能无法直接在.pth文件中引用环境变量。有关这些文件可接受的格式,请参见site文档(Python 23)。

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

  

执行从导入开始的行(后跟空格或制表符)。

可以以聪明的甚至可能危险的方式利用这种行为,以使任意Python代码作为路径构造的一部分执行(有关更多信息,请参见Graham Dumpleton的出色文章here)。

要通过环境变量支持路径配置,请创建具有以下内容的.pth文件:

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

这将适用于Python 2和3; import技巧仅在代码可以单行表示时有效。

如果定义了环境变量,则此代码会将EXTERNAL_DIR的值附加到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