我正在寻找一种导入模块的方法,以便可以从子文件夹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都能正常工作?
答案 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