之前有一个问题,但提问者只是覆盖了他们的输出并解决了他们自己的问题。
我正在使用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'])
答案 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''
- 原始字符串文字用于避免加倍反斜杠。