2015-02-12 2 views
0

Был предыдущий вопрос по этому вопросу, но искатель просто переписал их вывод и решил свою проблему.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']) 

ответ

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'' - сырым строковый литерал используется, чтобы избежать удвоения обратной косой черты.

Смежные вопросы