【问题标题】:subprocess.popen returning empty stringsubprocess.popen 返回空字符串
【发布时间】:2015-02-12 15:33:57
【问题描述】:

对此有一个较早的问题,但提问者只是覆盖了他们的输出并解决了他们自己的问题。

我正在使用 subprocess.popen 读取视频信息并将输出写入 json。它在大多数视频上运行良好,但在其他视频上却返回一个空字符串——即使它从命令行运行良好。我试了几次,通过命令行得到了很好的数据。

这是脚本的相关部分:

out_prj.write('[')

for m, i in enumerate(files):

        print i

        out_prj.write('{"$type":"BatchProcessor.Job, BatchProcessor","Id":0,"Ver":1.02,"CurrentTask":0,"IsSelected":true,"TaskList":[')
        f_name = os.path.basename(i[0])
        f_json = out_folder + os.sep + "06_Output" + os.sep + os.path.basename(i[0]).split(".")[0] + ".json"
        trans_f = out_folder + os.sep + "04_Video" + os.sep + os.path.basename(i[0]).split(".")[0] + "-tr.ts"
        trans_f_out = out_folder + os.sep + "06_Output" + os.sep + os.path.basename(i[0]).split(".")[0] + "-tr-out.ts"
        ffprobe = 'ffprobe.exe'
        command = [ffprobe, '-v', 'quiet', '-print_format', 'json', '-show_format', '-show_streams', i[0]]



        p = sp.Popen(command, stdout=sp.PIPE, stderr=sp.PIPE, shell=True)

        out, err = p.communicate()
        io = cStringIO.StringIO(out)
        info = json.load(io)
        print info
        filea = open(f_json, 'w')
        filea.write(json.dumps(info))
        filea.close()

        f = open(f_json)
        b = json.load(f)
        print b
        #########################

        ###################
        f_format = str(b['streams'][0]['codec_long_name'])

【问题讨论】:

    标签: json subprocess popen


    【解决方案1】:

    您的代码忽略错误消息(err 变量)。 print err 或者不要重定向 stderr 来查看它们。

    无关:代码中的 json 处理很疯狂:大多数操作都是多余的。

    将子进程的输出保存到文件:

    import os
    from subprocess import check_call
    
    f_json = os.path.join(out_folder, "06_Output",
                          os.path.splitext(f_name)[0] + ".json")
    with open(f_json, 'wb', 0) as file:
        check_call(command, stdout=file)
    

    注意:这里不需要shell=True。如果subprocess 找不到ffprobe.exe,则指定完整路径,例如(使用适合您系统的路径):

    ffprobe = r'C:\Program Files\Real\RealPlayer\RPDS\Tools\ffmpeg\ffprobe.exe' 
    

    注意:r'' -- 使用原始字符串文字来避免加倍的反斜杠。

    【讨论】:

      猜你喜欢
      • 2013-05-14
      • 2020-01-27
      • 2020-07-11
      • 2015-05-25
      • 2011-05-09
      • 1970-01-01
      • 2012-07-20
      • 2011-12-15
      • 2020-11-23
      相关资源
      最近更新 更多