首页 > 解决方案 > Python3 导入

问题描述

我正在寻找一种导入模块的方法,以便我可以从子文件夹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 

step1:project/v0我运行python3 SearcheEngineBE.py我的模块时,我的模块被正确导入,一切顺利。

step2:但是,当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 步都可以工作?

标签: pythonpython-3.x

解决方案


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

您可以在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

编辑: 没有根包,这是行不通的。请参阅这篇文章以了解另一种方法:从 Python 中的相邻文件夹导入模块


推荐阅读