我正在使用python3,venv和c9.io PAAS编写一个Web应用程序。我的代码具有以下结构:
batch_runner.py
logic/
__init__.py
parsers/
__init__.py
time_parser.py
abstract_parser.py
在这里batch_runner
import 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'
在这种情况下,一种可能的解决方案是在包内使用相对导入:
也就是说,在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)的这篇博客文章描述了其中许多内容,如果您打算开发一个程序包,我个人认为这是必读的内容。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句