【问题标题】:Python 3 - ImportError: cannot import namePython 3 - ImportError:无法导入名称
【发布时间】:2021-04-12 17:18:05
【问题描述】:

我有一个文件夹:

python_scripts/test_import/
|-- __init__.py
|-- m1.py
`-- m2.py

m1.py的内容:

a=3

m2.py的内容:

from . import m1

print(m1.a)

当我尝试执行m2.py 时,出现以下错误:

# python3 python_scripts/test_import/m2.py
Traceback (most recent call last):
  File "python_scripts/test_import/m2.py", line 1, in <module>
    from . import m1
ImportError: cannot import name 'm1'

但如果我将m2.py 中的导入更改为:

import m1

print(m1.a)

然后我看不到任何错误并且预期执行结果:

3

问题: 为什么用点的相对导入在这里不起作用?

【问题讨论】:

  • 当您在 m2 中时,您位于 python_scripts 的 test_import 文件夹中。所以你必须上两层才能找到 m1.py,因为它与 python_scripts 处于同一级别。上一级意味着与 test_import 相同的级别,这是不正确的。
  • @IrfaanJamarussadiq m1.py 和 m2.py 都在同一级别,它们位于 test_import 中。顺便说一句,JohntheTyro 给出了明确的答案。

标签: python python-3.x import


【解决方案1】:

错误:无法导入名称 m1 相对导入使用导入文件的name属性来确定文件在整个包结构中的位置,但是直接运行python脚本时,name module 设置为 ma​​in 而不是模块的原始名称。这样就无法识别相对路径。 因此,为此您不能直接使用它,您的 main.py 需要位于顶部文件中

python_scripts/     
  |-- main.py :from test_import.m import m2
    /test_import/
      _init_.py
      /m/
        |-- __init__.py
        |-- m1.py
        |-- m2.py

或者如果你坚持这样做,你必须改为 from .m1 import *

【讨论】:

  • 别忘了给我一些声誉,我现在正在赢得他们
  • 谢谢,您的回答解决了一切问题。事实上,对我来说,从上面的任意文件级别导入模块就足够了。我似乎对如何正确处理模块有了更好的理解。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-02
  • 2014-09-27
  • 2020-04-09
  • 2016-12-24
  • 2012-11-12
  • 1970-01-01
相关资源
最近更新 更多