Python多进程脚本被导入时if __name__ == '__main__'不生效如何解决
问题原因
- 你通过
import FIVE的方式加载多进程脚本时,被导入模块的__name__值默认是模块名(也就是你提到的SCRIPT_NAME/FIVE),只有直接运行该脚本时__name__才会等于__main__,所以原本的判断条件不会触发 - 你修改判断条件为模块名后多进程无法正常运行,是因为Python的
multiprocessing采用spawn启动模式时(Windows默认、macOS/Linux可配置),子进程启动会重新导入所有依赖模块,进程池、共享内存管理器的初始化逻辑必须放在if __name__ == "__main__"的保护下,否则会出现逻辑重复执行、进程启动失败的问题
解决方案
1. 调整多进程子脚本(FIVE.py/SCRIPT_NAME.py)结构
把业务逻辑封装为独立函数,不要写在模块顶级的判断分支里,避免依赖模块导入的副作用执行代码:
import multiprocessing # 原有函数逻辑保持不变 def saveLogs(): pass def goBackToMain(): pass def newChecker(email): # 建议把共享的bad_list/good_list通过参数传入,不要依赖全局变量 pass def mp_handler(all_emails, bad_list, good_list): with multiprocessing.Pool(1) as p: p.map(newChecker, all_emails) # 把整个功能逻辑封装为入口函数 def run(): multiprocessing.freeze_support() manager = multiprocessing.Manager() bad_list = manager.list() good_list = manager.list() # 原有变量定义、文件操作逻辑保持不变 FILE_NAME_DATE_GOODS = '{}{}{}'.format(location_emails_goods, todayString, '.txt') FILE_NAME_DATE_BADS = '{}{}{}'.format(location_emails_bads, todayString, '.txt') with open(FILE_NAME_DATE_BADS, 'a') as file_bads, open(FILE_NAME_DATE_GOODS, 'a') as file_goods: mp_handler(ALL_EMAILS, bad_list, good_list) saveLogs() goBackToMain() # 保留直接运行该脚本的兼容逻辑 if __name__ == "__main__": run()
2. 修改main.py的调用逻辑
导入子模块后手动调用封装好的run()函数,不要依赖模块导入时的顶级代码执行:
# 把原判断分支的import逻辑修改为: elif int(selection) == 5: import FIVE FIVE.run()
3. 额外兼容优化
给main.py的执行入口也加上__name__判断,避免子进程启动时重复弹出选择菜单:
# main.py最后一行修改为: if __name__ == "__main__": wholeMain()
内容的提问来源于stack exchange,提问作者rident smith
相关产品推荐
相关产品推荐

