Python sys.path修改不起作用

11

我试图修改我的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

它可以工作。

谢谢


5
请放置一些展示如何添加路径的代码。 - Daniel Roseman
我觉得在过去的10年中,导入机制可能已经发生了足够大的变化,以至于这个问题不再存在,或者至少会有不同的解决方法。 - pcurry
4个回答

19

你需要发布一些代码,以便我们能够帮助您。 但是,我可以做一个有根据的猜测。你说如果你创建一个全新的列表并将其分配给sys.path,那么它会起作用。我想你指的是像这样做的:

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

但是如果你将路径插入到开头,它就不起作用。我猜你正在使用insert方法,就像这样:

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

如果是这样,那么这是不正确的。这将创建一个类似于以下的列表:

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

你应该使用

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

这将为您提供

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

在你发布代码之前,这都只是猜测。


3

我在使用iPython处理分布在多个目录中的模块时,遇到了类似的问题。在这种情况下,为了让导入功能正常工作,必须确保具有分布式__init__.py的模块的module.__path__包括所有其中一个模块的__init__.py所在的目录,并确保正确的目录已添加到sys.path列表中。

例如,我有一个名为foo的模块,其中包含一个名为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")

这对我有用。

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接