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

使用Nuitka编译依赖rembg库的Python程序时u2net.onnx文件找不到的问题

解决Nuitka打包rembg程序时u2net.onnx模型找不到的问题

问题原因

Nuitka单文件打包时会将程序解压到临时目录运行,你之前的打包参数未正确将u2net.onnx模型文件打包到对应路径,同时代码未适配临时目录的路径获取逻辑,导致ONNXRuntime无法找到模型文件。

解决方案

1. 修正Nuitka打包参数

使用--include-data-files参数(而非--include-plugin-directory)指定单个数据文件的打包规则,格式为源文件路径=目标路径,确保模型文件被放到临时目录的rembg子文件夹下,和原库结构一致:

nuitka --standalone --onefile --follow-imports --enable-plugin=tk-inter --include-data-files="myenv\Lib\site-packages\rembg\u2net.onnx=rembg\" --windows-icon-from-ico=icon.ico main.py
  • 这里的=rembg\表示将源文件打包后放到临时目录下的rembg文件夹中,匹配rembg库预期的路径结构。

2. 适配代码中的模型路径获取

在你的代码中,针对Nuitka单文件打包的情况,动态获取模型文件的实际路径(运行时程序会解压到sys._MEIPASS指向的临时目录):

import sys
import os
from rembg import remove, new_session

def get_model_path():
    # 判断是否为单文件打包运行环境
    if hasattr(sys, '_MEIPASS'):
        # 临时目录下的rembg文件夹路径
        return os.path.join(sys._MEIPASS, 'rembg', 'u2net.onnx')
    else:
        # 开发环境下的模型路径,根据实际环境调整
        return os.path.join(os.path.dirname(__file__), 'myenv', 'Lib', 'site-packages', 'rembg', 'u2net.onnx')

# 使用自定义模型路径创建session
session = new_session(model_path=get_model_path())

# 去除背景时使用该session
def remove_background(image_path):
    with open(image_path, 'rb') as f:
        input_img = f.read()
    output_img = remove(input_img, session=session)
    # 后续保存逻辑...

3. 验证打包结果

打包完成后运行程序,模型会自动解压到临时目录(路径类似C:\Users\<你的用户名>\AppData\Local\Temp\Nuitka\...\rembg\),此时ONNXRuntime就能正确找到模型文件。

为什么之前的方法无效?

  • --include-plugin-directory是用于包含插件目录的参数,不适合单个文件的打包,无法正确将模型文件放到指定位置。
  • 手动将模型复制到exe所在目录无效,因为单文件程序运行时是从临时目录加载资源,而非exe所在目录。

内容的提问来源于stack exchange,提问作者inferatu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 13:37:53