2013-05-20 2 views
0

Я использую subprocess.popen python для извлечения информации о видеофайле.Почему subprocess.popen возвращает пустую строку

output = Popen('ffmpeg -i "'+avifile+'" -dframes 0 -vframes 0', 
    executable="/bin/bash", stdout=PIPE, stderr=STDOUT, 
    shell=True).communicate()[0] 

Дело в том, что всякий раз, когда я запускаю его, выходная переменная является пустой строкой, когда я знаю, что должно быть что-то. Я могу вручную запустить ffmpeg в порядке.

Я думаю, может быть, это проблема с трубами и перенаправление. Интересно, может ли кто-нибудь это исправить.

+0

Что делает 'output = Popen (...). Communication()' дать вам? возможно, вы получите сообщение об ошибке –

+0

нет ошибки, просто ничего. – incognito2

+2

Передайте последовательность аргументов вместо строки, вы избежите проблем с кавычками –

ответ

0
cmd = ['ffmpeg','-i',avifile,'-dframes','0','-vframes', '0'] 

output = Popen(cmd, 
    #executable="/bin/bash", ive never seen this used ... you may not need it 
    stdout=PIPE, stderr=PIPE, 
    shell=True).communicate() 

попробовать, что вместо того, чтобы быть ...

+0

Im получение TypeError: execv() arg 2 должен содержать только строки. avifile - это строковая переменная. – incognito2

+0

Что такое avifile? 'print avifile, type (avifile)' –

+0

Это было 0 без кавычек. Но это все еще не сработало. Выходная переменная пуста. – incognito2

0

Для чтения комбинированной стандартного вывода/Stderr как строки и получить исключение на статусе ненулевой возвраты:

from subprocess import STDOUT, check_output as qx 

output = qx(['ffmpeg', '-i', avifile] + '-dframes 0 -vframes 0'.split(), 
      stderr=STDOUT) 

Не используйте shell=True, если вам это не нужно.

+1

... почему 'qx'? Я думаю, что это запутанное имя, и я не вижу причин менять читаемый 'check_output' с ним. – Bakuriu

+0

читаемость зависит от вашего фона. Происхождение 'qx' (eXecute) - это обратные обратные (обратные котировки) *' '' 'команда' '' * в bash и соответствующий * 'qx (command)' * operator в perl. – jfs

0

Я изменил выход переменной на video_output, и он по какой-то причине сработал. У меня совершенно нет причин.

+0

My * guess * заключается в том, что вы каким-то образом переписываете переменную 'output', поэтому, переименовывая ее, код больше не переписывает. Если бы вы разместили MWE, мы бы не потеряли время, спекулируя, но мы могли бы указать на настоящую проблему. – Bakuriu

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