繁体   English   中英

python在虚拟环境上导入文件

[英]python importing file on virtual environment

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

更改此:

from abstract_parser import abstract

from logic.parsers.abstract_parser import abstract

请阅读有关模块的python文档中有关导入的内容

在这种情况下,一种可能的解决方案是在包内使用相对导入:

也就是说,在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)的这篇博客文章描述了其中许多内容,如果您打算开发软件包,我个人认为这是必读的内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM