首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python3进口

Python3进口
EN

Stack Overflow用户
提问于 2019-05-29 13:30:15
回答 2查看 1.1K关注 0票数 2

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

我在python3.6中的文件结构(这就是为什么没有init文件)

代码语言:javascript
复制
project
├── api.py
├── v0
│   ├── SearchEngine.py     => contains SearchEngine class
│   └── SearchEngineBE.py

我的SearchEngineBE.py模块包含

代码语言:javascript
复制
from SearchEngine import SearchEngine

我的api.py模块包含

代码语言:javascript
复制
from v0.SearchEngineBE import SearchEngineBE 

step1:当我从project/v0运行python3 SearcheEngineBE.py时,我的模块是正确导入的,一切都进行得很顺利。

step2:,但是,当从project运行python3 run api.py时,我得到了错误:

代码语言:javascript
复制
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'

我如何解决这个问题,使第一步和第二步都能工作?

EN

回答 2

Stack Overflow用户

发布于 2019-05-29 13:34:37

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

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

代码语言:javascript
复制
# SearchEngineBE.py
from .SearchEngine import SearchEngine

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

需要使用__init__.py文件才能将包含该文件的目录视为包。

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

票数 2
EN

Stack Overflow用户

发布于 2019-05-29 13:36:07

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

代码语言:javascript
复制
project
├── __init__.py
├── api.py
├── v0
│   ├── SearchEngine.py     => contains SearchEngine class
│   └── SearchEngineBE.py

编辑1:

试着:

代码语言:javascript
复制
from project.v0.SearchEngine import SearchEngine
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56361809

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档