subprocess.popen返回空字符串

时间:2015-02-12 15:33:58

标签: json subprocess popen

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

我正在使用subprocess.popen来读取视频信息并将输出写入json。它在MOST视频上工作正常,但在其他视频上返回一个空字符串 - 即使它从命令行运行正常。我尝试了几次,并通过命令行获取数据。

以下是该脚本的相关部分:

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'])

1 个答案:

答案 0 :(得分:0)

您的代码会忽略错误消息(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'' - 原始字符串文字用于避免加倍反斜杠。