【问题标题】:How can I solve this cannot ImportError: cannot import name in python3我该如何解决这个不能 ImportError: cannot import name in python3
【发布时间】:2020-06-23 10:36:39
【问题描述】:

参考资料库 --> https://github.com/SavSanta/bluinfo

所以,我试图导入我在名为 bluinfo.py 的文件中创建的类 BDROM。 (第 27 行)

通过将from bluinfo import BDROM 行添加到 bluinfo-gui.py(第 8 行)

我收到ImportError: cannot import name 'BDROM'

我不知道如何让这个坏小子工作。其他帖子指出它可能与 PYTHONPATH 相关(尽管类似的导入已经在程序的其他部分工作并且所有文件都在同一个目录中)。


我尝试通过以下方式更改导入语句,但均未成功:

  1. 从 .bluinfo 导入 BDROM
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named '__main__.bluinfo'; '__main__' is not a package
  1. 从 ..bluinfo 导入 BDROM
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: attempted relative import beyond top-level package
  1. 创建一个 init.py 文件(我相信我在 python3.x 中没有必要阅读该文件)并尝试导入
$dev:/tmp/blue/bluinfo$ touch __init__.py
$dev:/tmp/blue/bluinfo$ python3 bluinfo-gui.py 
Traceback (most recent call last):
  File "bluinfo-gui.py", line 8, in <module>
    from bluinfo import BDROM
  File "/tmp/blue/bluinfo/bluinfo.py", line 8, in <module>
    import ts_scanner as ScanTask
  File "/tmp/blue/bluinfo/ts_scanner.py", line 5, in <module>
    import ts_streamtypeclass
  File "/tmp/blue/bluinfo/ts_streamtypeclass.py", line 3, in <module>
    from bluinfo import BDROM
ImportError: cannot import name 'BDROM'

任何想法表示赞赏!

【问题讨论】:

标签: python python-3.x python-import importerror


【解决方案1】:

在您的第三次尝试中,您有一个循环导入。重构你的代码以避免这种情况。

例如,您可能能够消除这些导入之一,并且您将摆脱循环依赖。

  File "/tmp/blue/bluinfo/bluinfo.py", line 8, in <module>
    import ts_scanner as ScanTask

  File "/tmp/blue/bluinfo/ts_streamtypeclass.py", line 3, in <module>
    from bluinfo import BDROM

PS:由于您在名为blueinfo 的目录中有一个名为blueinfo.py 的文件,因此import blueinfo 语句可能表示包(目录)或模块(文件)。您可以考虑将 blueinfo 目录中的文件重命名为更具描述性的名称,以避免这种歧义。

【讨论】:

  • 所以循环导入中断发生在 from bluinfo import BDROM 中的“文件”/tmp/blue/bluinfo/ts_streamtypeclass.py”第 3 行,这是有道理的,因为它是最最近的更改,我再次导入它以使用在 BDROM 类上定义的静态方法。除了重新实现文件中的方法之外,似乎没有其他办法。所以我想我会同意的。谢谢
  • 重命名没有帮助
  • 正确命名事物可以使代码更易于人类理解。在这种情况下,对模块和包使用相同的名称会使我们更难理解当 Python 的导入解析没有给出我们期望的结果时会发生什么。它并没有解决这里的错误,但它可能有助于避免将来出现类似的错误。
猜你喜欢
  • 1970-01-01
  • 2015-03-07
  • 1970-01-01
  • 2020-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-03
  • 2019-10-25
相关资源
最近更新 更多