Python3导入

时间:2019-05-29 13:30:15

标签: python python-3.x

我正在寻找一种导入模块的方法,以便可以从子文件夹project/v0和根文件夹project中运行脚本。

我在python 3.6中的文件结构(这就是为什么没有初始化文件的原因)

project
├── api.py
├── v0
│   ├── SearchEngine.py     => contains SearchEngine class
│   └── SearchEngineBE.py

我的SearchEngineBE.py模块包含

from SearchEngine import SearchEngine

我的api.py模块包含

from v0.SearchEngineBE import SearchEngineBE 

第1步::从project/v0运行python3 SearcheEngineBE.py时,模块已正确导入,一切正常。

第二步:但是,当我从project运行python3 run api.py时,出现错误消息:

Traceback (most recent call last):
  File "api.py", line 3, in <module>
    from v0.SearchEngineBE import SearchEngineBE 
  File "/xxx/project/v0/SearchEngineBE.py", line 3, in <module>
    from SearchEngine import SearchEngine
ModuleNotFoundError: No module named 'SearchEngine'

如何解决此问题,以便步骤1和步骤2都能正常工作?

2 个答案:

答案 0 :(得分:0)

解释器会在当前目录(以及所有其他搜索路径)中搜索非相对导入。

您可以在SearchEngineBE.py文件中使用相对导入,以使解释器知道您想要相对模块,而不是导入路径之外的模块:

# SearchEngineBE.py
from .SearchEngine import SearchEngine

.使解释器知道您正在引用相对于当前模块的模块。您至少需要在与__init__.py相同的目录中有一个空白的SearchEngine.py文件,才能使相对导入起作用:

  

__init__.py文件是Python处理目录所必需的   包含文件作为包。

https://docs.python.org/3/tutorial/modules.html

有关更多讨论,请参见本指南:https://chrisyeh96.github.io/2017/08/08/definitive-guide-python-imports.html#absolute-vs-relative-import

编辑: 没有根包,这将无法工作。有关其他方法,请参见此帖子:Importing modules from a neighbouring folder in Python

答案 1 :(得分:0)

添加__init__.py使其成为package。 (它可以是空文件:__init__.py

project
├── __init__.py
├── api.py
├── v0
│   ├── SearchEngine.py     => contains SearchEngine class
│   └── SearchEngineBE.py

编辑1:

尝试:

from project.v0.SearchEngine import SearchEngine