从内部访问包中的每个模块?

时间:2012-09-18 09:29:57

标签: python package directory-structure relative-import

如何构建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.py导入bar/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上的大约五十个主题和互联网上的无数篇文章。从我发现的所有内容中import src.foo.*语句应该可以在包内的任何位置工作,如果只有__init__.py文件位于每个文件夹中。

有没有人有同样的问题?

3 个答案:

答案 0 :(得分:1)

我认为应该是

from ..foo import analyse

由于未确定..本身意味着什么:可能只是引用顶级包,因此您必须说明要删除的包树的其他分支:foo in这种情况。

有了这个,我可以(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'

另外,正如您可能已经注意到的那样,对于您当前的结构,“main”包被称为src,因为这是您的顶级__init__.py所在的位置。可能不是你想要的。

答案 1 :(得分:1)

根据你的目录结构,在main.py上你应该有:

import foo.analyse
import bar.dbhandler

然后像这样打电话(例如):

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

如果从目录main.py启动程序,它应该可以正常工作。否则你应该按照Nicola Musatti的建议检查你的PYTHONPATH,或者使用.pth文件或你拥有的任何一个选项。

答案 2 :(得分:0)

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

import foo.analyse