【问题标题】:cyclic import AttributeError: 'module' object has no attribute [duplicate]循环导入AttributeError:“模块”对象没有属性[重复]
【发布时间】:2014-05-04 06:10:24
【问题描述】:

我正在尝试理解循环导入问题,这里我有三个 python 文件,

py1.py

import py3
py3.test3()
def test1():
    print 'test 1'

py2.py

import py1
py1.test1()
def test2():
    print 'test 2'

py3.py

import py2
py2.test2()
def test3():
    print 'test 2'

当我运行python py3.py 并得到这样的错误时,

Traceback (most recent call last):
  File "py3.py", line 1, in <module>
    import py2
  File "/home/me/Desktop/hackerearth/cylic/py2.py", line 1, in <module>
    import py1
  File "/home/me/Desktop/hackerearth/cylic/py1.py", line 1, in <module>
    import py3
  File "/home/me/Desktop/hackerearth/cylic/py3.py", line 3, in <module>
    py2.test2()
AttributeError: 'module' object has no attribute 'test2'

但是当我从 py1.py 文件中删除 import py3 时,我得到的输出没有任何错误。任何人解释我为什么我得到这个错误。

【问题讨论】:

    标签: python


    【解决方案1】:

    在 Python 中,文件被执行。一个函数在其def“执行”之前不存在。

    您的问题是这样的:当您 import 一个模块时,解析器会停止它在该文件中的位置,并开始解析(执行)正在导入的新文件。

    因此,当您运行 python py3.py 时,它会开始解析文件。它到达import py2,然后停止它正在做的事情,开始解析py2.py,等等py1.py

    当它到达import py3 时,它再次开始对它进行配对。然而,当它到达import py2 时,它意识到它已经 导入了py2,然后转到下一行。在这里,它遇到py2.test2()。但是,请记住,我们从未完成解析 py2,因此 test2() 还不存在。

    按执行顺序:

    # start at py3.py
    import py2
    
    # now in py2.py
    import py1
    
    # now in py1.py
    import py3
    
    # now in py3.py - this time being parsed as module
    import py2       # this already happened, skip it.
    py2.test2()      # doesn't exist yet
    

    如果您将print 语句添加到文件的最顶部,您将看到此行为。


    真正的问题是你有全局可执行语句。相反,如果您包含典型构造:

    if __name__ == '__main__':
        # First real executable statement goes here
    

    那么在模块完全导入之前,您将永远不会尝试“做任何事情”。

    【讨论】:

    • 很好的解释。所以它与循环导入问题无关。你能给我解释一下what is circular import problem in python ?。我需要知道这件事。
    • 这是循环输入问题。正如我在答案末尾指出的那样,它可以解决。
    • +1 为您提供很好的解释..
    • 谢谢。我鼓励您在所有文件的顶部添加print "This is pyX.py",然后自己尝试一下。
    • 我按照您在答案中所说的进行了尝试。你的回答有好处。 :)
    猜你喜欢
    • 2018-07-07
    • 2017-04-22
    • 2015-09-27
    • 2016-05-22
    • 2017-11-22
    • 2012-07-09
    • 2010-11-18
    相关资源
    最近更新 更多