我有两个python模块:

a.py

import b

def hello():
  print "hello"

print "a.py"
print hello()
print b.hi()

b.py

import a

def hi():
  print "hi"

当我运行a.py时,我得到:

AttributeError: 'module' object has no attribute 'hi'

这个误差是什么意思?我该怎么解决呢?


当前回答

当我从git中签出一个旧版本的存储库时,我遇到了这个问题。Git替换了我的.py文件,但留下了未跟踪的.pyc文件。由于.py文件和.pyc文件不同步,.py文件中的导入命令无法在.pyc文件中找到相应的模块。

解决方案就是删除.pyc文件,并让它们自动重新生成。

其他回答

你可以通过添加2个print来理解:

a.py:

print(__name__)
import b

b.py:

print(__name__)
import a

然后:

$ python3 a.py
__main__
b
a

a.py最终会被加载/执行2次。一个作为__main__,一个作为a。

您有相互的顶级导入,这几乎总是一个坏主意。

如果你真的必须在Python中有相互导入,方法是在函数中导入它们:

# In b.py:
def cause_a_to_do_something():
    import a
    a.do_something()

现在a.py可以安全地导入b而不会产生问题。

(乍一看,cause_a_to_do_something()似乎效率非常低,因为每次调用它时它都会导入,但实际上导入工作只在第一次执行。第二次和以后导入一个模块时,这是一个快速操作。)

在某些情况下,可能只是文件保存在正确的目录中,但在虚拟环境中写入文件时,文件中写入的python还没有保存。因此,当python将a.py导入到b.py时,不会导入任何代码。在其他方面是空白的。这似乎是我经常看到的一个容易识别的错误。值得一查。 科迪

问题在于模块之间的循环依赖关系。a导入b, b导入a。但其中一个需要先加载——在这种情况下,python最终会在b之前初始化模块a,而当你试图在a中访问它时,b.hi()还不存在。

你存了'b.py'吗? 你必须先保存'b.py'。