【问题标题】:Python not able to find my module even it existsPython 无法找到我的模块,即使它存在
【发布时间】:2021-07-11 00:42:07
【问题描述】:

我的文件夹结构是

fold1/fold2/a.py
fold1/fold3/b.py
fold1/fold3/c.py

a.py 正在做

from fold1.fold3 import c

c.py 正在做

import b

当我运行 a.py 时,我收到错误“没有名为 b 的模块”

我在所有文件夹中都有__init__.py,但仍然是我收到该错误的原因。

我知道最后python会检查当前目录中的包,所以这里的当前目录是“fold2”,我在那个fold2中没有找到“b.py”?但是“c.py”和“b.py”都在同一个目录中,但是为什么我会收到这个错误?

编辑:代码是由pyxb python模块生成的,所以我不能更改import语句。

【问题讨论】:

  • 最简单的解决方案是下载 pycharm,删除所有导入语句,让 pycharm 处理您的导入
  • 问题是导入路径与进行导入的文件的位置无关。它仅由调用 Python 时的 cwd 确定,以及对 sys.path(和 PYTHONPATH 环境变量)所做的任何更改。
  • import b 说我希望 b 在 PYTHONPATH 中(事实并非如此,它在 PYTHONPATH/fold1/fold3 中)所以从那里导入 b 。 from . import b 在我的上下文中是说,b 在相对路径 . 所以从那里导入。

标签: python


【解决方案1】:

import b 是一个绝对 导入:b 必须在sys.path 中列出的包中找到。

要相对于包含c 的包导入b,请使用相对导入

from . import b

. 是指包含c (fold3) 的包。 .. 将引用包含 that 包的包 (fold1)。你也可以写

from ..fold3 import b

..指的是fold1,所以..fold3指的是包fold1中的模块fold3

当使用相对导入时,fold1 的存在位置无关紧要:它可能在 sys.path 中,也可能是某个其他包的子模块。只要fold1 的内部结构保持不变,相对导入将继续工作。

【讨论】:

    【解决方案2】:

    所有路径都相对于您启动解释器的位置!

    c.pyfold1 的父级中寻找b

    尝试改用from fold1.fold3 import b 之类的表单

    【讨论】:

      猜你喜欢
      • 2015-09-23
      • 1970-01-01
      • 1970-01-01
      • 2018-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-04
      • 1970-01-01
      相关资源
      最近更新 更多