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 上的大约 50 个线程和互联网上的无数文章。从我发现的所有内容来看import src.foo.*,如果只有__init__.py文件位于每个文件夹中,该语句应该可以在包内的任何地方工作。

有没有人有同样的问题?

4

3 回答 3

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。可能不是你想要的。

于 2012-09-18T09:40:04.980 回答
1

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

import foo.analyse
import bar.dbhandler

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

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

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

于 2012-09-18T09:44:31.713 回答
0

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

import foo.analyse
于 2012-09-18T09:42:00.517 回答