Python跨脚本调用函数报AttributeError无对应属性问题咨询
报错原因
- 核心原因:
script2.py中所有函数、变量的定义都写在了if __name__ == "__main__":代码块内。这个判断条件仅在直接运行script2.py时才会成立,块内代码才会执行;当script2.py被其他脚本作为模块导入时,该判断条件不成立,块内的SpecificFolders函数根本不会被定义,自然导入后模块就没有对应属性,触发AttributeError。 - 还存在几个隐藏逻辑问题,就算修复导入问题也会触发报错:
SpecificFolders函数中用到的input_folder_name变量定义在script1.py中,script2.py本身没有这个变量,直接调用会报NameErrorscript1.py中用到的outlook、user变量定义在script2.py中,script1.py没有直接定义这两个变量,运行会报错script2.py中没有定义AllFolders函数,走else分支时会触发AttributeError
修复方案
首先修改script2.py,将模块级的导入、变量、函数定义移到if __name__ == "__main__"外,函数依赖的参数改为显式传入:
# script2.py 修复后代码 import win32com.client import os import glob import re import sys path = 'C:\PycharmProjects' os.chdir(path) # 初始化outlook相关全局变量,移到判断块外,导入时也会执行 outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI") user = outlook.Application.Session.CurrentUser.AddressEntry.GetExchangeUser().PrimarySmtpAddress def SpecificFolders(folders, input_folder_name): # 把需要的input_folder_name改为入参,不依赖其他模块的全局变量 my_list = [] for folder in folders: if (folder.name == input_folder_name) and (input_folder_name != ""): print(folder.name) my_list.append(folder.name) my_list += SpecificFolders(folder.Folders, input_folder_name) return my_list # 补充定义缺失的AllFolders函数,可按需调整逻辑 def AllFolders(folders): my_list = [] for folder in folders: print(folder.name) my_list.append(folder.name) my_list += AllFolders(folder.Folders) return my_list if __name__ == "__main__": # 仅直接运行script2时需要执行的代码放在此处,比如测试逻辑 pass
再修改script1.py,显式传入函数需要的参数,从导入的script2模块中获取outlook和user变量:
# script1.py 修复后代码 import sys Wpath ='C:\PycharmProjects' sys.path.insert(1, Wpath) import script2 as my_script input_folder_name = 'TEST' def run_Script(): # 从导入的模块中获取全局变量 outlook = my_script.outlook user = my_script.user if len(input_folder_name) != 0: # 显式传入文件夹名称参数 my_script.SpecificFolders(outlook.Folders[user].Folders, input_folder_name) else: my_script.AllFolders(outlook.Folders[user].Folders) run_Script()
内容的提问来源于stack exchange,提问作者eduardo2111
相关产品推荐
相关产品推荐

