2012-09-18 20 views
0

Python包应该如何构造,以便为其中的任何模块创建一切可能?使每个模块都可以从内部访问?

我的文件结构如下:

Project/ 
    |---log/ 
    | |---some logs 
    | 
    |---src/ 
     |---foo/ 
     | |---__init__.py 
     | |---analyse.py 
     | |---export.py 
     |  
     |---bar/ 
     | |---__init__.py 
     | |---log.py 
     | |---dbhandler.py 
     | 
     |---__init__.py 
     |---main.py 

main.py初始化一切。我想导入foo/analyse.pybar/dbhandler.py,但我只收到一个错误:

AttributeError: 'module' object has no attribute 'analyse' 

我试过几次发言:

import Project.src.foo.analyse 
import src.foo.analyse 
import foo.analyse 
import analyse 

他们都给出了同样的错误。我也试过:

from .. import foo.analyse 
from .. import analyse 

但我收到:

ValueError: Attempted relative import beyond toplevel package 

我已经通过StackOverflow上和互联网上无数的文章大约五十线程不见了。从我发现的所有内容中,只要__init__.py文件位于每个文件夹中,import src.foo.*语句就可以从包中的任何位置运行。

有没有人有同样的问题?

+0

“我想将foo/analyse.py导入到bar/dbhandler.py”是什么意思?你想在'bar/dbhandler.py'中输入foo.analyse吗?或者你是否试图将它们都导入到'main.py'中? – jszakmeister

回答

0

确保您的PYTHONPATH包含Project/src然后用

import foo.analyse 
+0

问题在于它太晚了。现在它工作正常。我将它附加在src.__init__.py文件的开头 – Jake

1

我觉得应该是

from ..foo import analyse 

因为它是不确定的本身是什么..意味着:这可能只是指的是顶层包,所以你必须说出你想要哪个包树的其他分支在这种情况下下降:foo

就这样,我可以做(提供src是您PYTHONPATH在这种情况下,我刚开始在Project目录级别。):

>>> import src 
>>> import src.bar 
>>> import src.bar.dbhandler 
>>> src.bar.dbhandler.analyse 
<module 'src.foo.analyse' from 'src/foo/analyse.py'> 
>>> src.bar.dbhandler.analyse.__file__ 
'src/foo/analyse.py' 

而且,你可能会注意到,与当前的结构,“主要”程序包称为src,因为这是您的顶级__init__.py所在的地方。可能不是你想要的。

1

鉴于你的目录结构,在main.py你应该有:

import foo.analyse 
import bar.dbhandler 

然后调用像这样(例如):

foo.analyse.number_cruncher() 
bar.dbhandler.db_store() 

如果从目录开始该程序在,它应该照原样工作。否则,您应该按照Nicola Musatti的建议检查您的PYTHONPATH,或使用.pth文件或您拥有的许多选项中的任何一个。