2013-05-20 6 views
0

J'utilise subprocess.popen de python pour récupérer des informations d'un fichier vidéo. La chose est quand je l'exécute la variable de sortie est une chaîne vide quand je sais qu'il devrait y avoir quelque chose. Je peux manuellement exécuter ffmpeg bien.pourquoi subprocess.popen retourne une chaîne vide

Je pense que c'est peut-être un problème avec les tuyaux et la redirection que je fais. Je me demandais si quelqu'un pouvait réparer ça.

+0

qu'est-ce que 'output = Popen (...) .communication()' vous donne? peut-être que vous obtenez une erreur –

+0

il n'y a pas d'erreur, juste rien. – incognito2

+2

Passez une séquence d'arguments au lieu d'une chaîne, vous éviterez les problèmes avec les guillemets –

Répondre

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() 

essayer au lieu peut-être ...

+0

Im get TypeError: execv() arg 2 ne doit contenir que des chaînes. avifile est une variable de chaîne bien que. – incognito2

+0

qu'est-ce que avifile? 'print avifile, type (avifile)' –

+0

C'était le 0 sans guillemets. Mais ça n'a toujours pas marché. La variable de sortie est vide. – incognito2

0

Pour lire stdout combiné/stderr comme une chaîne et pour obtenir une exception sur l'état de non-retour à zéro:

from subprocess import STDOUT, check_output as qx 

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

Ne pas utiliser shell=True sauf si vous en avez besoin.

+1

... pourquoi 'qx'? Je pense que c'est un nom confus et je ne vois aucune raison de changer le 'check_output 'lisible avec lui. – Bakuriu

+0

la lisibilité dépend de votre arrière-plan. L'origine de 'qx' (eXecute) est backticks (backward Quotes) *' \ 'commande \' '* dans bash et l'opérateur *' qx (commande) '* correspondant dans perl. – jfs

0

J'ai changé la sortie de la variable en video_output et cela a fonctionné pour une raison quelconque. Je n'ai absolument pas pourquoi.

+0

Ma * supposition * est que vous étiez en train d'écraser la variable 'output' d'une manière ou d'une autre, par conséquent le renommer maintenant le code ne l'écrase plus. Si vous aviez posté un MWE alors nous n'aurions pas perdu de temps à spéculer mais nous aurions pu signaler le vrai problème. – Bakuriu

Questions connexes