You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python跨脚本调用函数报AttributeError无对应属性问题咨询

报错原因
  1. 核心原因:script2.py中所有函数、变量的定义都写在了if __name__ == "__main__":代码块内。这个判断条件仅在直接运行script2.py时才会成立,块内代码才会执行;当script2.py被其他脚本作为模块导入时,该判断条件不成立,块内的SpecificFolders函数根本不会被定义,自然导入后模块就没有对应属性,触发AttributeError。
  2. 还存在几个隐藏逻辑问题,就算修复导入问题也会触发报错:
  • SpecificFolders函数中用到的input_folder_name变量定义在script1.py中,script2.py本身没有这个变量,直接调用会报NameError
  • script1.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 17:15:00