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
相关产品推荐
相关产品推荐

