Windows系统下Python multiprocessing跨脚本调用失效问题求解
问题根源
- 核心错误是你把
if __name__ == "__main__"的判断写在了Test.run()方法内部:当Script1被作为模块导入到Script2时,Script1的__name__值为Script1而非__main__,所以run方法里的多进程逻辑直接被跳过,完全不会执行。 - 次要问题:Script1末尾的
Test([2, 3]).run()没有包裹在if __name__ == "__main__"块中,当Script1被导入时这行代码会自动执行,属于不规范写法;Script2的导入语句加了多余的.py后缀,也是语法错误。 - Windows下Python的multiprocessing默认用spawn方式启动子进程,子进程会重新导入整个入口模块,所以入口脚本的执行逻辑必须套
if __name__ == "__main__"避免重复执行,该问题和Spyder无关,但Spyder的交互运行环境可能额外产生兼容性问题。
最佳解决方案
第一步:修改Script1.py
把if __name__ == "__main__"判断从run方法中移除,仅包裹Script1单独运行时的测试逻辑:
# Script1.py import multiprocessing class Test(object): def __init__(self, x): self.x = x def square(self, i, return_jobs, x): i = x**2 return_jobs[i] = i def run(self): # run方法仅保留业务逻辑,不要加__name__判断 manager = multiprocessing.Manager() return_jobs = manager.dict() jobs = [] for i in range(len(self.x)): p = multiprocessing.Process(target = self.square, args=(i, return_jobs , self.x[i]) ) jobs.append(p) p.start() for proc in jobs: print(proc) proc.join() print('result',return_jobs.values()) return return_jobs.values() # 仅单独运行Script1时才执行测试代码 if __name__ == "__main__": Test([2, 3]).run()
第二步:修改Script2.py
修正导入语法,同时给入口执行逻辑加上if __name__ == "__main__"判断,符合Windows多进程的启动要求:
# Script2.py # 导入模块不需要加.py后缀 from Script1 import Test import multiprocessing class Test2(object): def __init__(self, y): self.y = y def run(self): z = Test(self.y).run() return z # 入口执行逻辑必须套__name__判断 if __name__ == "__main__": Test2([4,5,6]).run()
Spyder环境适配注意事项
- Spyder默认的IPython交互控制台不支持multiprocessing的spawn启动模式,运行会报错,建议在运行配置中勾选「在外部系统终端执行」,或者直接用系统cmd/powershell运行脚本即可。
内容的提问来源于stack exchange,提问作者KAJ226
相关产品推荐
相关产品推荐

