【问题标题】:Python: Unexpected ImportErrorPython:意外的导入错误
【发布时间】:2023-03-19 07:29:01
【问题描述】:

我有这些模块和包:

main.py/                          
        pkg1/                  
            __init__.py
            maclasse1.py

        pkg2/                  
           __init__.py
           maclasse2.py

ma​​in.py:

from pkg1 import maclasse1
from pkg2 import maclasse2
if __name__=="__main__":
   MC1=maclasse1.MaClasse1()
   MC1.ma_classe1()
   MC2=maclasse2.MaClasse2()
   MC2.ma_classe2()

ma​​classe1.py

from pkg2 import maclasse2
class MaClasse1:
   def ma_classe1(self):
       print "Ma Classe 1"
       c2=maclasse2.MaClasse2()
       c2.ma_classe2()

ma​​classe2.py

from pkg1 import maclasse1
class MaClasse2:
   def ma_classe2(self):
       print"Ma Classe 2"
       mc1=maclasse1.MaClasse1()
       mc1.ma_classe1()

当我运行 ma​​in.py 文件时,我收到此错误:

Traceback (most recent call last):
  File "main.py", line 1, in <module>
    from pkg1 import maclasse1
  File "/home/nakkini/Desktop/tester/pkg1/maclasse1.py", line 1, in <module>
    from pkg2 import maclasse2
  File "/home/nakkini/Desktop/tester/pkg2/maclasse2.py", line 1, in <module>
    from pkg1 import maclasse1
ImportError: cannot import name maclasse1

如何解决这个问题?

编辑:

根据 Tim 的评论,我在 pkg3 中创建了一个 tohelp.py,它导入了 maclasse1.py,而 maclass2.py 导入了 tohelp.py,但我仍然遇到同样的问题。

【问题讨论】:

  • 你有循环依赖
  • 文件A导入文件B,文件B导入文件A
  • 这看起来像 import recursion
  • 短篇小说:这就是 Python 中导入系统的工作原理。长话短说:stackoverflow.com/questions/744373/…
  • a 需要 b 加载 .. 但 b 需要 a ... 所以无法加载

标签: python python-module


【解决方案1】:

如果你不打算改变架构,试试这个:

ma​​classe1.py

class MaClasse1:
    def ma_classe1(self):
        from pkg2 import maclasse2
        print "Ma Classe 1"
        c2=maclasse2.MaClasse2()
        c2.ma_classe2()

ma​​classe2.py

class MaClasse2:
    def ma_classe2(self):
        from pkg1 import maclasse1
        print"Ma Classe 2"
        mc1=maclasse1.MaClasse1()
        mc1.ma_classe1()

【讨论】:

  • 呸。尽可能将导入保持在模块级别!
  • 确实如此。但是,这有助于避免循环导入错误。尽管如此,改变架构还是更可取的。
  • 您的解决方案是避免问题的明智方法。谢谢
猜你喜欢
  • 2021-04-06
  • 2017-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-22
  • 1970-01-01
  • 2020-06-15
  • 1970-01-01
相关资源
最近更新 更多