【问题标题】:python importing file on virtual environmentpython在虚拟环境中导入文件
【发布时间】:2017-01-09 23:48:49
【问题描述】:

我正在使用 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,而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,但找不到从abstract_parser调用的time_parser,抛出ImportError: No module named 'abstract'

【问题讨论】:

  • 请添加什么文件导入什么,以及您正在使用的确切导入语句。你在用from logic import abstract_parser吗?您如何尝试导入time_parser__init__.py 文件包含什么内容?
  • 谢谢。添加了所有关于导入的信息

标签: python python-venv c9.io


【解决方案1】:

改变这个:

from abstract_parser import abstract

from logic.parsers.abstract_parser import abstract

【讨论】:

  • 如果您使用此解决方案,您可以将parsers/__init__.py 留空,并在拨打电话时使用from logic.parsers import abstract_parser as ap 后跟ap.abstract( ... )。当您需要导入 abstract_parser 下的大量名称时,这特别有用。
【解决方案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 描述了其中的许多,如果您打算开发一个包,我个人认为这是必读的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-18
    • 1970-01-01
    相关资源
    最近更新 更多