如何在导入模块时访问script.py中__main__块内的futures字典?
解决从其他脚本访问script.py中futures字典的问题
问题根源在于:当你从其他脚本导入script.py时,脚本的__name__变量值是script而非__main__,所以if __name__ == '__main__':代码块里的逻辑不会执行,futures字典始终是空的。
给你两个实用的解决办法:
方法1:封装成可调用的函数
把创建和填充futures的逻辑封装成一个函数,其他脚本导入后主动调用该函数获取填充好的字典:
修改后的script.py代码:
import pandas as pd import concurrent.futures files = ['1.xlsx','2.xlsx'] futures = {} def init_futures(): global futures # 声明使用全局的futures变量 with concurrent.futures.ProcessPoolExecutor() as executor: for filename in files: future = executor.submit(pd.read_excel, filename) futures[filename] = future return futures if __name__ == '__main__': init_futures()
其他脚本中调用的方式:
import script # 调用函数初始化并获取futures futures_dict = script.init_futures() # 或者直接访问script.futures,此时已经被函数填充 print(script.futures)
方法2:移出__main__代码块(谨慎使用)
如果确定不需要避免导入时执行多进程逻辑,可以把填充futures的代码移出__main__块,但要注意:这种方式会在你导入script.py时自动执行多进程任务,可能导致不必要的资源消耗,甚至引发多进程导入的潜在问题:
修改后的script.py代码:
import pandas as pd import concurrent.futures files = ['1.xlsx','2.xlsx'] futures = {} with concurrent.futures.ProcessPoolExecutor() as executor: for filename in files: future = executor.submit(pd.read_excel, filename) futures[filename] = future if __name__ == '__main__': # 这里可以保留原有的主逻辑 pass
其他脚本导入后直接访问:
import script print(script.futures)
推荐使用方法1,因为它更可控,能避免导入时意外执行耗时的多进程任务。
内容的提问来源于stack exchange,提问作者lagrangian_headache
相关产品推荐
相关产品推荐

