2009-06-19 289 views
7

我试图修改我的一个Python文件中的sys.path,以便在模块搜索路径中有一些 特定库目录(它可能不是最好的方法 但是...)。如果我在sys.path的前面插入几条路径,我的脚本没有考虑将来导入的路径。如果我制作一个包含这些库dirs的全新列表,并将这个列表分配给sys.path,那么将这些导入考虑在内。这是正确的行为?我使用python 2.5.4。它可能是我的环境中可能导致这种行为的东西吗?Python sys.path修改不起作用

一些代码片段: 如果我做

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

这是行不通的。它没有考虑到路径。

如果我这样做

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

它的工作原理。

谢谢

+4

请张贴一些代码,显示如何添加路径。 – 2009-06-19 13:21:34

回答

17

你真的需要发布一些代码,我们可以帮助你。但是,我可以做出有根据的猜测。你说如果你创建一个全新的列表并将其分配给sys.path,那么它就可以工作。我假设你的意思是你正在做这样的事情

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

但是,如果你在开始插入路径,那么它不起作用。我的猜测是你正在使用插入方法,就像这样

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

如果是这样,那么这是不正确的。这将创建一个看起来像

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

而应该说

​​

,这将给你

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

但是,这是所有的猜测,直到您发布的代码清单。更新的sys.path的

4

来自实例here

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

这个工作对我采取的。

1

我刚刚在iPython中使用分布在多个目录中的模块时遇到了类似的问题。在这种情况下,要导入工作,必须确保module.__path__分布式模块__init__.py包含模块的其中一个__init__.py所在的所有目录,并确保正确的目录位于sys.path列表中。

例如,我有一个名为foo的模块,它包含一个模块调用的酒吧,分布在几个目录:

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中,我已经进口的巴兹和BAF,并希望导入QUUX 。

from foo.bar import quux

这给了一个ImportError,因为carol不在sys.path,但sys.path.append('carol')没有修复导入错误。

需要的是通知bar模块,它的__init__.py之一可以在'carol/foo/bar'中找到。

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