PYTHONPATH与sys.path

PYTHONPATH与sys.path,python,python-import,pythonpath,sys.path,Python,Python Import,Pythonpath,Sys.path,另一位开发人员和我不同意是否应该使用PYTHONPATH或sys.path来允许Python在用户(例如开发)目录中查找Python包 我们有一个具有典型目录结构的Python项目: Project setup.py package __init__.py lib.py script.py 在script.py中,我们需要执行导入package.lib。当包安装在站点包中时,script.py可以找到package.lib 然而,

另一位开发人员和我不同意是否应该使用
PYTHONPATH
sys.path
来允许Python在用户(例如开发)目录中查找Python包

我们有一个具有典型目录结构的Python项目:

Project
    setup.py
    package
        __init__.py
        lib.py
        script.py
在script.py中,我们需要执行
导入package.lib
。当包安装在站点包中时,script.py可以找到
package.lib

然而,当从用户目录工作时,需要做一些其他的事情。我的解决方案是将我的
PYTHONPATH
设置为包含
“~/Project”
。另一名开发人员希望将这行代码放在script.py的开头:

sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
这样Python就可以找到
package.lib
的本地副本

我认为这是一个坏主意,因为这行代码只对开发人员或使用本地副本运行的人有用,但我不能给出一个好的理由来说明这是一个坏主意


我们应该使用
PYTOHNPATH
sys.path
,还是可以?

如果修改路径的唯一原因是开发人员从他们的工作树工作,那么您应该使用安装工具为您设置环境。virtualenv非常流行,如果您使用setuptools,您只需运行
setup.py develope
即可在当前的Python安装中半安装工作树。

我认为,在这种情况下,使用PYTHONPATH是一件更好的事情,主要是因为它不会引入(可疑的)不必要的代码

毕竟,如果你想一想,你的用户不需要那种
sys.path
的东西,因为你的包会被安装到站点包中,因为你将使用一个打包系统


如果用户选择从“本地副本”(如您所说)运行,那么我观察到,通常的做法是声明,如果在站点包之外使用,则需要手动将包添加到PYTHONPATH。

我讨厌PYTHONPATH。我发现基于每个用户(特别是守护程序用户)设置并跟踪项目文件夹的移动是脆弱和烦人的。我更愿意在独立项目的调用脚本中设置
sys.path

但是,
sys.path.append
不是实现这一点的方法。您可以很容易地获得副本,而且它不会对
.pth
文件进行排序。更好(更可读):
site.addsitedir


而且
script.py
通常不是执行此操作的合适位置,因为它位于您希望在路径上可用的包中。库模块当然不应该接触系统路径本身。相反,您通常会在用于实例化和运行应用程序的包外有一个散列脚本,在这个简单的包装脚本中,您会将部署细节(如
sys.path
-frobbing)以及前面提到的许多其他原因放在一起,您还可以指出硬编码

sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(_文件__)))


是脆弱的,因为它假定script.py的位置——它仅在script.py位于项目/包中时才起作用。如果用户决定移动/复制/复制Script .pY(几乎)在其他任何地方,它就会崩溃。一般来说,我会考虑设置环境变量(比如python PATH)。 这是一个坏习惯。虽然这对于一次性调试来说可能很好,但将其用作
经常练习可能不是个好主意

使用环境变量会导致一些情况,例如当某个环境变量 else报告代码库中的问题。同样的,你也可以用同样的方法来练习 测试环境也是如此,这会导致一些情况,例如测试在一个特定的环境中运行良好
特定的开发人员,但当有人启动测试时可能会失败。

由于前面提到的原因,黑客
PYTHONPATH
sys.path
都不是一个好主意。要将当前项目链接到site packages文件夹,实际上有一种比
python setup.py develope
更好的方法,如下所述:

pip安装--可编辑路径/到/项目

如果您的项目根文件夹中还没有setup.py,那么可以从以下内容开始:

from setuptools import setup
setup('project')

site.addsitedir
的问题在于它在
sys.path
上执行了一个
append
,这意味着一个已安装的包将优先于开发中的本地包(并且可能会出现拉毛)
sys.path.insert(0…
需要克服这个问题。@EliBendersky:应该是
sys.path.insert(1
。投票和答案似乎相当平均,略微倾向于使用PYTHON_路径,尽管这可能是采样噪音或问题的无意偏差。对于
路径
系统路径
(以及间接的
PYTHONPATH
)之间的差异另请参见,您能否对此提供更多的说明?即使您支持conda/virtualenv环境,这将如何将顶级目录放在python路径上?