如何构建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
文件位于每个文件夹中。
有没有人有同样的问题?
答案 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