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

Win10下Python通过subprocess运行Darknet YOLOv4预训练模型报错问询

问题答复

1. subprocess执行Darknet命令的合理性

  • 完全可行,是Python侧调用预编译Darknet最实用的方案之一。相比编译Python绑定、适配不同版本Darknet的API差异,直接调用可执行文件的兼容性更好,后续打包napari插件时只要随包附带对应版本的Darknet可执行文件、做好路径校验,就能稳定运行。
  • 你之前在Jupyter中用!前缀执行Shell命令,本质就是IPython封装的subprocess调用,逻辑上没有区别。

2. 「命令无法识别」报错修复

这个报错是Windows环境下几个常见问题叠加导致的,按以下步骤逐一修正即可:

  • 第一时间删除代码里的!chmod +x ./darknet,这是Linux/macOS下的文件权限命令,Windows的CMD/PowerShell完全不支持,执行只会额外抛出无关错误。
  • 确认可执行文件名正确:Windows下编译生成的Darknet程序是带后缀的darknet.exe,不是无后缀的darknet,你代码里写的.\darknet路径匹配不到任何可执行文件,自然会触发命令不存在的报错,把路径改成.\darknet.exe即可。
  • 修正subprocess的传参逻辑:
    • 你当前的写法混用了列表传参和shell=True,还把输入重定向符<当成普通参数传递,这在Windows下是无效的。要么直接拼接完整命令字符串交给Shell解析,要么关闭shell=True,通过subprocess的stdin参数传入测试文件列表。
    • 你的路径中包含空格、带重音的特殊字符,不要手动写斜杠拼路径,用Python原生的raw字符串或os.path模块处理路径,避免转义错误。
  • 修正后的可运行参考代码如下:
import os
import subprocess

# 路径统一用raw字符串避免转义问题
darknet_root = r'C:\Users\User\OneDrive - Université de Bourgogne\Documents\Stage\yolo\darknet'
data_path = r'C:\Users\User\OneDrive - Université de Bourgogne\Documents\Stage\yolo\main_folder\Model_ALL_views\obj.data'
cfg_path = r'C:\Users\User\OneDrive - Université de Bourgogne\Documents\Stage\yolo\main_folder\yolov4-tiny-test.cfg'
weight_path = r'C:\Users\User\OneDrive - Université de Bourgogne\Documents\Stage\yolo\main_folder\Model_ALL_views\backup\yolov4-tiny-train_best.weights'
pred_csv_path = r'C:\Users\User\OneDrive - Université de Bourgogne\Documents\Stage\yolo\main_folder\Model_ALL_views\Prediction.csv'
test_list_path = r'C:\Users\User\OneDrive - Université de Bourgogne\Documents\Stage\yolo\main_folder\Model_ALL_views\test.txt'

# 方案1:拼接完整命令交给shell处理,写法和你之前在Jupyter里的逻辑完全一致
cmd = f'.\\darknet.exe detector test "{data_path}" "{cfg_path}" "{weight_path}" -thresh 0.20 -dont_show -out "{pred_csv_path}" < "{test_list_path}"'
subprocess.run(cmd, shell=True, cwd=darknet_root)

# 方案2(更安全,无shell注入风险):不启用shell,手动传入测试文件作为标准输入
# with open(test_list_path, 'r', encoding='utf-8') as test_f:
#     subprocess.run(
#         ['.\\darknet.exe', 'detector', 'test', data_path, cfg_path, weight_path, '-thresh', '0.20', '-dont_show', '-out', pred_csv_path],
#         stdin=test_f,
#         cwd=darknet_root
#     )
  • 兜底校验:如果改完仍提示找不到命令,先手动打开命令提示符切到Darknet目录,执行dir darknet.exe确认文件存在;如果文件存在仍无法启动,说明编译Darknet时依赖的CUDA、OpenCV动态链接库缺失,把对应dll文件放到Darknet根目录即可解决。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 18:54:24