Python跨模块调用静态变量遇属性错误,求免重复API调用方案
问题根源
每个Python脚本运行时都是独立的操作系统进程,类的静态变量仅存在于当前进程的内存空间中。script1里设置的Helper.number只属于script1的进程,script2作为新启动的进程,其Helper类是重新导入的,完全没有number属性,因此触发AttributeError。
方案1:命令行参数传递数据(最直接简单)
利用script1调用script2时传递参数,同时让script2支持两种模式:接受外部参数(从script1调用时)、自行调用API获取数据(单独命令行运行时)。
修改后代码
script1.py
from helper import Helper import os print("Running script1") # 模拟API调用 number_from_api = 5 hlpr = Helper(number_from_api) num = Helper.number print(f"The num fetched is {num}") for _ in range(num): # 调用script2时传递number作为命令行参数 os.system(f"python3 script2.py {num}")
script2.py
import sys from helper import Helper def get_number(): # 优先从命令行参数获取 if len(sys.argv) > 1: return int(sys.argv[1]) # 无参数时自行调用API获取(模拟) print("Fetching number from API in script2") return 5 print("Running script2!") number = get_number() result = number + 2 print(f"New result is {result}")
helper.py(可保持原样)
class Helper(): def __init__(self, number): print("Initializing Helper Class") Helper.number = number
优点:实现简单,完全保留script2单独运行的能力,进程间无依赖。
缺点:如果传递的数据复杂,需要处理序列化(比如用JSON字符串传递)。
方案2:文件存储共享数据
script1将API获取的数据写入文件,script2优先读取文件,文件不存在时再调用API。
修改后代码
script1.py
from helper import Helper import os import json print("Running script1") # 模拟API调用 number_from_api = 5 hlpr = Helper(number_from_api) num = Helper.number print(f"The num fetched is {num}") # 将数据写入临时文件 with open("shared_data.json", "w") as f: json.dump({"number": num}, f) for _ in range(num): os.system("python3 script2.py") # 可选:执行完后删除文件 # os.remove("shared_data.json")
script2.py
import json import os from helper import Helper def get_number(): # 检查共享文件是否存在 if os.path.exists("shared_data.json"): with open("shared_data.json", "r") as f: data = json.load(f) return data["number"] # 无文件时自行调用API获取(模拟) print("Fetching number from API in script2") return 5 print("Running script2!") number = get_number() result = number + 2 print(f"New result is {result}")
优点:适合传递复杂数据结构,无需修改调用时的参数格式。
缺点:需要处理文件读写的异常(比如文件被占用),还要考虑文件清理的问题。
方案3:进程内函数调用(补充方案)
如果可以调整script1的调用方式,不用os.system启动新进程,而是直接导入script2的函数调用,就能利用进程内的静态变量共享数据,同时保留script2单独运行的能力。
修改后代码
script2.py
from helper import Helper def run_script2(): print("Running script2!") result = Helper.number + 2 print(f"New result is {result}") if __name__ == "__main__": # 单独运行时自行初始化Helper(模拟API调用) Helper(5) run_script2()
script1.py
from helper import Helper import script2 print("Running script1") number_from_api = 5 hlpr = Helper(number_from_api) num = Helper.number print(f"The num fetched is {num}") for _ in range(num): script2.run_script2()
优点:进程内共享数据,效率最高。
缺点:script1不能用os.system启动script2,必须通过导入调用函数。
内容的提问来源于stack exchange,提问作者You_Donut
相关产品推荐
相关产品推荐

