Utiliser correctement subprocess.PIPE en python?
Je suis en train d'utiliser subprocess.Popen
pour construire une séquence de saisir la durée d'un fichier vidéo. J'ai cherché pendant 3 jours, et ne peuvent pas trouver une raison quelconque en ligne pourquoi ce code ne fonctionne pas, mais il continue de me donner un vide résultat:
import sys
import os
import subprocess
def main():
the_file = "/Volumes/Footage/Acura/MDX/2001/Crash Test/01 Acura MDX Front Crash.mov"
ffmpeg = subprocess.Popen(['/opt/local/bin/ffmpeg', '-i', the_file], stdout = subprocess.PIPE, )
grep = subprocess.Popen(['grep', 'Duration'], stdin = subprocess.PIPE, stdout = subprocess.PIPE, )
cut = subprocess.Popen(['cut', '-d', ' ', '-f', '4'], stdin = subprocess.PIPE, stdout = subprocess.PIPE, )
sed = subprocess.Popen(['sed', 's/,//'], stdin = subprocess.PIPE, stdout = subprocess.PIPE, )
duration = sed.communicate()
print duration
if __name__ == '__main__':
main()
source d'informationauteur Gordon Fontenot | 2010-03-22
Vous devez vous connecter pour publier un commentaire.
stderr doit être redirigé vers stdout. Aussi, il n'y a pas besoin de faire appel à d'autres outils comme
cut/sed
etc. faire votre manipulation de chaîne en PythonSi Python n'est pas une obligation, vous pouvez utiliser le shell directement.
Comme d'autres l'ont souligné, vous avez besoin pour passer la conduite d'un processus à l'autre.
Le stdout (PIPE) à partir d'un processus devient le stdin pour la tâche suivante.
Quelque chose comme ceci (à partir de votre exemple):
À l'aide de
subprocess.PIPE
ne sera pas comme par magie fil le bon tuyaux pour vous.Vous devez passer à la sortie de la pipe du premier processus comme valeur pour le paramètre
stdin
de la deuxième processus. Voir la documentation pour un exemple.Python ne peut pas "la construction d'un pipeline" de cette façon -, il pourrait déléguer la tâche à la coque, ou de la colle de plus directement à l'aide de la
stdout
attributs de la précédente sous-processus des objets dans la ligne, mais il n'y a vraiment aucune raison pour que, dans ce cas précis, puisque vous pouvez coder directement en Python assez facilement. E. g.: