python 在虚拟环境中导入文件

python importing file on virtual environment

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

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

此处 batch_runner 导入 abstract_parser,而后者又从 time_parser 导入。一切都已安装并且 运行s 已激活 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,但找不到从 [=15 调用的 time_parser =], 投掷 ImportError: No module named 'abstract'

改变这个:

from abstract_parser import abstract

from logic.parsers.abstract_parser import abstract

请阅读有关从 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 导入系统有数量惊人的陷阱,您可能会落入其中。 This blog post 作者 Nick Coghlan 描述了其中的许多内容,如果您打算开发一个包,我个人认为这是必读的内容。