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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 19:57:03