Python sys.path 修改无效

11 投票
4 回答
51478 浏览
提问于 2025-04-15 12:22

我正在尝试修改我一个Python文件中的sys.path,以便将一些特定的库目录加入到模块搜索路径中(可能这不是最好的方法,但...)。如果我在sys.path的前面插入几个路径,我的脚本就不会考虑这些路径进行后续的导入。如果我创建一个新的列表,包含我需要的那些库目录,并把这个列表赋值给sys.path,那么这些导入就会被考虑。这是正常的行为吗?我使用的是Python 2.5.4。是不是我的环境有什么问题导致了这种情况?

一些代码片段:

如果我这样做:

pathtoInsert1 = " .... "
pathtoInsert2 = " .... "
sys.path.insert(0, pathToInsert1)
sys.path.insert(0, pathToInsert2)

这就不行。它没有考虑这些路径。

如果我这样做:

pathList = [pathToInsert1, pathToInsert2] 
sys.path = pathList

这就可以。

谢谢。

4 个回答

3

我在使用iPython时遇到了类似的问题,涉及到一些分散在多个文件夹中的模块。为了让导入功能正常工作,必须确保那些有分散的__init__.py的模块的module.__path__包含所有包含该模块的__init__.py的文件夹,同时还要确保正确的文件夹在sys.path列表中。

举个例子,我有一个叫做foo的模块,里面有一个叫做bar的模块,而这个bar模块分布在几个不同的文件夹里:

aerith/foo/bar/__init__.py
aerith/foo/bar/baz/__init__.py
bob/foo/bar/__init__.py
bob/foo/bar/baf/__init__.py
carol/foo/bar/__init__.py
carol/foo/bar/quux/__init__.py

在iPython中,我已经导入了baz和baf,现在想导入quux。

from foo.bar import quux

结果出现了ImportError错误,因为carol不在sys.path中,但即使我用sys.path.append('carol')也没有解决这个ImportError。

实际上,我需要告诉bar模块,它的一个__init__.py文件可以在'carol/foo/bar'这个路径下找到。

foo.bar.__path__.append('carol/foo/bar')
from foo.bar import quux
3

这是一个关于如何更新 sys.path 的例子,来源于 这里

import sys
sys.path.append("/home/me/mypy")

这个方法对我有效。

19

你真的需要发一些代码,这样我们才能帮到你。不过,我可以做个大概的猜测。你说如果你新建一个列表并把它赋值给 sys.path,那就能正常工作。我猜你的意思是你在做类似这样的事情:

sys.path = ["dir1", "dir2", ...]

但是如果你把路径插入到开头,那就不行了。我猜测你可能在使用插入方法,像这样:

sys.path.insert(0, ["dir1", "dir2"])

如果是这样的话,那就是不对的。这会创建一个看起来像这样的列表:

[["dir1", "dir2"], "dir3", ...]

你应该这样做:

sys.path[:0] = ["dir1", "dir2"]

这样就会得到:

["dir1", "dir2", "dir3", ...]

不过这些都只是猜测,直到你发出你的代码。

撰写回答