Flask应用中TotalSegmentator多线程报错:RuntimeError-未找到根路径
问题解决:Flask中多线程调用TotalSegmentator出现RuntimeError
问题根源
你遇到的错误是因为TotalSegmentator底层依赖的库使用了多进程,而Python在Windows/macOS默认的spawn多进程启动模式下,会重新执行主模块代码。你的Flask app实例创建代码(app = Flask(__name__))没有被if __name__ == '__main__':保护,导致子进程执行到这段代码时,模块名变为mp_main,Flask无法自动找到对应的root路径,从而抛出错误。
解决方案
方案1:用if __name__ == '__main__':保护Flask启动逻辑
将Flask app的初始化和启动代码放到主模块判断块中,避免子进程重复执行:
修改你的main.py结构:
from flask import Flask, redirect, url_for, request from threading import Thread def create_app(): app = Flask(__name__) # 注册路由 @app.route('/evaluation_page', methods=['POST']) def evaluation(): models_path = 'processing/prediction/train_models' results_path = 'processing/prediction/prediction_result' selected_file = 'upload/' + request.form['selectedFile'] n_folds = request.form['numberOfFolds'] n_repeats = request.form['numberOfRepeats'] segmentation_thread = Thread(target=totalsegmentator, args=(selected_file, 'processing/segmentation/result')) segmentation_thread.start() evaluation_thread = Thread(target=evaluate, args=(selected_file, models_path, results_path, int(n_folds), int(n_repeats))) evaluation_thread.start() return redirect(url_for('evaluation_page')) return app # 仅在主进程初始化app if __name__ == '__main__': app = create_app() app.run()
方案2:显式指定Flask的root_path
如果无法调整模块结构,可以在创建Flask app时,手动指定root路径,让Flask不需要依赖模块名查找:
import os from flask import Flask # 显式传入当前文件所在目录作为root_path app = Flask(__name__, root_path=os.path.abspath(os.path.dirname(__file__)))
补充说明
- 你使用的是
Thread启动任务,但问题本质是TotalSegmentator内部触发了多进程,所以线程本身没问题,核心是解决子进程中Flask模块加载的冲突。 - 若你在Linux/macOS环境下,也可以尝试将多进程启动方式改为
fork(仅适用于类Unix系统),但不推荐作为跨平台方案:import multiprocessing multiprocessing.set_start_method('fork')
内容的提问来源于stack exchange,提问作者picaesar
相关产品推荐
相关产品推荐

