【问题标题】:Add package path to python .pth file using environment variables使用环境变量将包路径添加到 python .pth 文件
【发布时间】:2017-12-17 01:24:13
【问题描述】:

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

背景:我的 python 项目(位于 /path/to/my/project 中)在 virtualenv 中运行,但需要使用外部(但本地)包。不能将 virtualenv 与 --sytem-site-packages 一起使用,因此我按照this answer 的建议通过 .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。

【问题讨论】:

    标签: python python-2.7 environment-variables pth


    【解决方案1】:

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

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

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

    可以巧妙地利用这种行为,也可能以危险的方式利用任意 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-16
      • 2020-01-03
      • 2019-07-28
      • 2020-07-30
      • 2018-11-27
      • 1970-01-01
      • 2021-02-28
      • 2011-05-19
      相关资源
      最近更新 更多