2012-02-24 102 views
11

我知道堆栈溢出中存在大量类似的问题。但常见的答案似乎并没有为我工作。即使使用__init__.py,相对路径也不起作用

我有这样

proj/ 
     lib/ 
      __init__.py 
      aa.py 
      bb.py 
      test/ 
       __init__.py 
       aa_test.py 

我想,如果我包括我的test.py代码

import lib.aa 

from lib import aa 

我就可以一个文件结构以引用lib/目录中的模块。但那并不奏效。

所以我试图添加到路径,它正确地将其添加:

os.environ["PATH"] += ":%s" % os.path.abspath(os.path.join("..","")) 
print os.environ["PATH"] 

,但即使是现在,当我尝试上面... import语句我不断收到错误

ImportError: No module named aa 

ImportError: Importing from non-package <Something...> 

有什么明显的我失踪了吗?

有没有办法检查我是否正确配置了我的__init__.py文件,或者查看我的包层次结构?

回答

2

lib目录需要位于您的python模块搜索路径中,与您的shell使用的搜索路径不同。

这可能会为你工作:

import sys, os 
sys.path.append(os.path.abspath("..")) 

但是,它可能是更好地从上下文那里的lib包已经在路径上运行代码。如从'proj'目录。

1

您试图从lib.aa导入的代码在哪里?我猜/ proj /不是你的工作目录,它需要是现在安装的。您可能希望将目录添加到PYTHONPATH中,以便它显示在搜索路径中以进行导入,而不是PATH。见http://docs.python.org/tutorial/modules.html#the-module-search-path

另外,请看看http://as.ynchrono.us/2007/12/filesystem-structure-of-python-project_21.html它强烈建议你把目录的额外水平的地方,以便代替lib.aa,你会称其为my_proj.lib.aa

0

系统PATH变量一些更多的信息不由python import语句使用。它使用PYTHONPATH,但添加新目录以导入搜索路径的最好方法是修改sys.path。

如果这没有帮助,请将您的sys.path值和os.getcwd()返回的值添加到问题中。

0

我有类似的问题,这里是我的建议。

而不是更改sys.path,更好地运行您的test.py在proj(即项目根目录)目录。这种方式项目目录将自动在sys.path,您将能够导入lib包。

并使用绝对导入。