2

我正在使用 python3、venv 和 c9.io PAAS 编写一个 Web 应用程序。我的代码结构如下:

batch_runner.py
logic/
    __init__.py
    parsers/
        __init__.py
        time_parser.py
        abstract_parser.py

这里batch_runnerimports abstract_parser,它又从 time_parser 导入。一切都已安装并在激活 venv 的情况下运行。

具体来说,batch_runner.py包含:

from logic.parsers import abstract
from sys import argv

url = argv[1]
a = abstract(url)

logic/__init__.py是空的。logic/parsers/__init__.py包含:

from abstract_parser import abstract
from time_parser import _timeInfo

如果我直接去logic运行python abstract_parser.py,一切都会按预期进行。但是,如果我上一层并运行python batch_runner.py,它可以导入abstract_parser,但找不到time_parser从哪个调用abstract_parser,抛出ImportError: No module named 'abstract'

4

2 回答 2

3

改变这个:

from abstract_parser import abstract

from logic.parsers.abstract_parser import abstract
于 2016-09-02T01:56:32.793 回答
2

请阅读有关从模块上的python 文档中导入的信息。

在这种情况下,一种可能的解决方案是在包中使用相对导入:

也就是说,在 中logic/parsers/__init__.py,使用:

from .abstract_parser import abstract
from .time_parser import _timeInfo

并在abstract_parser.py

from .time_parser import _timeInfo

这应该让parsers/__init__.py找到abstract_parser模块和time_parser模块。

python 导入系统有很多你可能会陷入的陷阱。Nick Coghlan 的这篇博客文章描述了其中的许多,如果你打算开发一个包,我个人认为它是必读的。

于 2016-09-02T02:27:10.697 回答