python在虚拟环境中导入文件

时间:2016-09-02 00:14:33

标签: python python-venv c9.io

我正在使用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_parserImportError: No module named 'abstract'

2 个答案:

答案 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描述了其中的许多内容,如果您计划开发一个软件包,我个人认为这是必读内容。