Python sys.path 修改无效
我正在尝试修改我一个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 个回答
我在使用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
你真的需要发一些代码,这样我们才能帮到你。不过,我可以做个大概的猜测。你说如果你新建一个列表并把它赋值给 sys.path,那就能正常工作。我猜你的意思是你在做类似这样的事情:
sys.path = ["dir1", "dir2", ...]
但是如果你把路径插入到开头,那就不行了。我猜测你可能在使用插入方法,像这样:
sys.path.insert(0, ["dir1", "dir2"])
如果是这样的话,那就是不对的。这会创建一个看起来像这样的列表:
[["dir1", "dir2"], "dir3", ...]
你应该这样做:
sys.path[:0] = ["dir1", "dir2"]
这样就会得到:
["dir1", "dir2", "dir3", ...]
不过这些都只是猜测,直到你发出你的代码。