无法在我的 colab python 代码中使用子流程

Unable to use subprocess in my colab python code

作为我正在使用 Yolov4 进行的项目的一部分,我正在尝试使用学习的权重测试多个图像,并将添加了边界框的结果图像复制到我的 google 驱动器。 以下是我 运行ning 在 colab 上的代码。 它只是不工作,并且没有要调试的日志消息。如果我直接在 cmd 变量中 运行 命令,请不要这样做,它工作正常,但这只是针对一张图像。 我的目标是自动化或“批量”测试过程。

感谢您的帮助。

    #%%capture
    import os,sys
    import subprocess
    directory = '/content/darknet/data/testimages/'
        for filename in os.listdir(directory):
            #cmd = "./darknet detector test data/obj.data cfg/yolov4-obj.cfg /content/darknet/cfg/yolov4-obj_4000.weights /content/darknet/data/testimages/" + filename 
            cmd = "!./darknet detector test data/obj.data cfg/yolov4-obj.cfg /content/darknet/cfg/yolov4-obj_4000.weights /content/darknet/data/testimages/" + filename 
            try:
              subprocess.run([sys.executable,cmd])
            except:
              print("failed")
            #print(os.path.join(directory, filename))
            cmd = "!cp 'predictions.jpg' '/mydrive/birds/results/" + filename + "_results.jpg' "
            #print(cmd)
            #cmd = "ls -ltr"
            subprocess.run([sys.executable,cmd])

经过几个小时的反复试验,在 Colab 页面上进行了简单的文档搜索,我找到了答案。它位于“向 shell 传递值和从 shell 传递值”的标题下。以下修改后的代码对我有用。

%%capture
import os,sys
import subprocess
directory = '/content/darknet/data/testimages/'
for filename in os.listdir(directory):
    cmd =  "./darknet detector test data/obj.data cfg/yolov4-obj.cfg /content/darknet/cfg/yolov4-obj_4000.weights /content/darknet/data/testimages/" + filename
    try:
      !{cmd}
    except:
      print("failed")
    cmd = "cp 'predictions.jpg' '/mydrive/birds/results/" + filename + "_results.jpg' "
    !{cmd}

尝试运行你的subprocess这种方式!

import os
import subprocess
env = os.environ.copy()
subprocess.run(cmd, shell=True, env=env)

这对我有用。我发现这适用于所有 OS。不要在 cmd.

中添加 !