使用.pth以编程方式在VirtualEnv中附加到PYTHONPATH

时间:2017-10-30 16:47:12

标签: python python-3.x python-3.6

如何使用Python脚本以编程方式将当前路径附加到当前Virtualenv的PYTHONPATH,使用.pth或其他方法?

这需要适用于Windows和Linux。

我试图在项目根路径中使用Python脚本setup.py,在执行时,将项目根路径添加到PYTHONPATH,以便嵌套目录中的其他脚本可以通过项目的相对导入来导入模块根

MyProjectRoot
+ setup.py
+ data 
+ source
    + foo
        + lib
            + qux
                + A.py
    + bar
        + assets
            + B.py
    + baz
        + C.py

例如,在C.py中,我们可以使用

import source.foo.lib.qux.A
import source.bar.assets.B

以避免必须将以下变体添加到希望相对于项目根目录使用导入的每个文件中:

basePath = os.path.abspath("../..")
sys.path.append(basePath)

1 个答案:

答案 0 :(得分:1)

您需要在每个包中添加foo文件,将libquxbarbaz__init__.py打包到包中目录,将source目录放在sys.path上(通过在运行脚本之前将目录添加到PYTHONPATH)并使用相对导入语法,如from .foo.lib.qux.A import ...

更新

通常,您需要从项目中创建一个合适的Python包。这是通过根据rules编写setup.cfgsetup.py文件来完成的。然后你应该安装你的包。安装期间 ,采取特定措施确保项目的目录和文件(或更确切地说包和模块)可导入。安装Python软件包的最常用方法是在软件包的根目录中运行pip install <package-name>pip install --editable .。 前者将包中的目录和文件复制到特定于Python解释器的site-packages目录。由于此目录在Python的启动包中放置sys.path,所以放置的模块可以通过任何Python代码自动导入。
后者适用于正在开发的包,并导致在已提及的.pth目录中创建site-packages文件。文件的内容是包的根目录的路径。在Python启动期间读取所有.pth个文件,并将路径添加到sys.path列表中。

如果您想在不安装项目/包的情况下导入包和模块,那么您可以自己扩展sys.path
您可以使用项目根目录的路径创建.pth文件,并将其放在适当的site-packages目录中。要找出您正在使用的Python实例的site-packages目录,请参阅How do I find the location of my Python site-packages directory?
或者,您可以在运行Python之前设置环境变量PYTHONPATH - PYTHONPATH=/path/to/the/project/root/dir /path/to/python script-from-project.py