我正在使用python3,venv和c9.io PAAS编写一个Web应用程序。我的代码结构如下:
batch_runner.py
logic/
__init__.py
parsers/
__init__.py
time_parser.py
abstract_parser.py
此处batch_runner
导入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'
答案 0 :(得分:2)
改变这个:
from abstract_parser import abstract
要
from logic.parsers.abstract_parser import abstract
答案 1 :(得分:2)
请阅读有关从python documentation模块导入的信息。
在这种情况下,一种可能的解决方案是在包中使用相对导入:
即,在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撰写的This blog post描述了其中的许多内容,如果您计划开发一个软件包,我个人认为这是必读内容。