【问题标题】:Import a class from different folder levels - Python从不同的文件夹级别导入一个类 - Python
【发布时间】:2020-02-12 09:56:01
【问题描述】:

我正在编写一个序列到序列模型,并且我有以下目录结构

MyProject/
     models/ 
          - __init__.py
          - Encoder.py
     train/
          - __init__.py
          - Train.py

在 Train.py 中,尽管尝试使用以下语法,但我无法从 Encoder.py 导入 BiDirectionalEncoder 类

from models.Encoder import BiDirectionalEncoder 

对于上面的行,我收到错误“ ModuleNotFoundError: 没有名为 'models' 的模块"

from ..models.Encoder import BiDirectionalEncoder

对于最后一行,我收到错误“ImportError:尝试使用没有已知父包的相对导入”

有没有巧妙的方法来解决这个问题?我不想使用任何 sys.path.append() 来强制添加路径 我在 Spyder 4.0.1 中使用 Python 3.7.6 谢谢!

【问题讨论】:

  • from models.Encoder import BiDirectionalEncoder 不工作吗?
  • 不,不是。这也有点令人沮丧和惊讶,我不知道出了什么问题。
  • 运行程序时你的当前目录文件是什么?如果您尝试从Train.py 运行,则系统找不到主我的项目路径。
  • @Wajih 你能解决这个问题吗?
  • 我试过了。似乎这是 Spyder 的问题。感谢您的解决方案。

标签: python class import subdirectory


【解决方案1】:

在同一个包中,您可以进行相对导入,但由于您要退出当前包,因此需要进行绝对导入。

from MyProject.models.Encoder import BiDirectionalEncoder 

【讨论】:

  • 您的意思是我将项目路径名添加到导入中?那会很笨重。我不确定。让我试试这个。
  • 是的,正如错误消息所暗示的那样。ValueError:尝试在顶级包之外进行相对导入您不能在当前包之外导入,除非它被添加到 sys.path或 PYTHONPATH。
  • 嗯。现在它显示“ModuleNotFoundError: No module named 'MyProject'” 我在 MyProject 文件夹的根目录下确实有一个 init.py
  • 原来是spyder的问题
【解决方案2】:

如果您使用任何 IDE(例如 pycharm),您需要将(我的项目)设置为源引导目录 否则你需要在 settings.py 中检查你的 BASE_DIR

然后你就可以导入模型了。

从models.Encoder导入BiDirectionalEncoder

是的,如果您想从下面的其他环境访问模块是链接 访问和共享模块的方式。

python module:- importing(accessing) creating and sharing

希望这能解决您的问题。

【讨论】:

  • 我不想像我在问题中提到的那样强制使用路径。特别是当我在其他环境或机器上部署代码时
猜你喜欢
  • 2011-12-18
  • 2018-07-19
  • 1970-01-01
  • 2019-06-17
  • 1970-01-01
  • 1970-01-01
  • 2016-02-19
  • 2018-03-26
  • 1970-01-01
相关资源
最近更新 更多