跨模块调用带参函数遇AttributeError:模块导入问题排查
解决跨模块调用函数时的AttributeError问题
嘿,我来帮你捋捋这个问题!你遇到的AttributeError大概率是两个原因导致的:要么是包结构没弄对,要么是函数引用的方式错了。咱们一步步来解决:
首先检查你的项目结构
Python要识别文件夹为包,每个文件夹下必须有一个__init__.py文件(空文件就行)。你的项目结构应该是这样的:
你的项目根目录/ ├── folder1/ │ ├── __init__.py │ └── file1.py └── folder2/ ├── __init__.py └── file2.py
如果没有这两个__init__.py,Python不会把folder1和folder2当作合法的包,导入时自然找不到里面的函数,就会报has no attribute 'function1'的错误。
然后修正你的代码错误
看你file2.py里的代码,这里有个明显的问题:
func1 = file1.function1()
你这里加了括号,是直接调用function1函数,而不是把函数本身赋值给func1!而且function1需要参数a,你调用的时候没传参数,这行本身就会先触发TypeError,就算你传了参数,func1会变成function1执行后的返回值(你的function1没有return,所以是None),后面再写func1(a)就会报错说NoneType不是可调用的。
修改后的正确代码
方法一:保持原导入方式,正确引用函数
from folder1 import file1 # 去掉括号,只是引用函数对象,不是调用它 func1 = file1.function1 def function2(): a = 5 func1(a) # 现在才是真正调用函数,传入参数a # 测试一下 if __name__ == "__main__": function2()
方法二:直接导入目标函数,更简洁
from folder1.file1 import function1 def function2(): a = 5 function1(a) if __name__ == "__main__": function2()
额外注意:Python搜索路径
如果上面的方法还是不行,可能是你的项目根目录不在Python的搜索路径里。可以在file2.py的最开头加上这段代码,把项目根目录添加到搜索路径中:
import sys # 替换成你的项目根目录的绝对路径 sys.path.append("/path/to/your/project/root")
这样修改后,你再运行file2.py应该就能正常调用function1了!
内容的提问来源于stack exchange,提问作者Wouter
相关产品推荐
相关产品推荐

