Forum Programmation.python Problème utilisation programmes externes (via shell)

Posté par  .
Étiquettes : aucune
0
17
sept.
2007
Bonjour à tous,

étant amateur de montage vidéo, il y a quelques temps déjà , j'ai adapté un script shell existant (images2mpeg) pour que la sortie soit un fichier .dv au lieu d'un fichier mpeg.

Maintenant, je cherche à faire une interface graphique pour ce script (en fait l'interface est faite et fonctionne).

En premier lieu, j'ai uniquement lancé mon script à partir de Python par une commande

commands.getstatusoutput('monscript'+paramètres)

et ça fonctionne. Seulement, avec cette méthode, pas moyen de visualiser l'avancement du script (la conversion d'image en fichier .dv ça prend vite beaucoup de temps !).

Donc, je cherche à refaire le script shell dans python ... et là, j'ai un problème.

Dans le script shell, il y a une boucle while principale dans laquelle les images sont mises en forme (avec ImageMagick) et transformée en flux d'image ppm (ou pnm ?). La sortie de cette boucle est envoyée dans un pipe vers "l'encodeur" dv (encodedv de libdv).

En code ça donne plus ou moins ceci (en simplifié)

while (condition de la boucle)
do
convert $images :ppm - | cat
done | encodedv [options] > [fichier de sortie]


et donc, la sortie de la boucle while est directement envoyée en entrée (par le pipe) dans encodedv.

Je voudrais donc remplacer la boucle while du script shell par une boucle python et envoyer le résultat dans encodedv par un pipe ...

J'ai essayé le code suivant (python cette fois) :


from subprocess import *

image=[image1,image2,image3]
for img in image :
i=0
while i < 51 :
p1=Popen('convert '+img+' :ppm - | cat', shell=True, stdout=PIPE)
print "Image encodée : "+str(i)

p2=Popen('encodedv [options] > [fichier de sortie]', shell=True, stdin=p1.stdout, stdout=PIPE)

(Attention, il manque l'indentation ! J'ai pas trouvé la balise pour les espaces)

Voilà, mais le problème est que ça ne fonctionne pas !

Si je passe par un fichier intermédiaire ça fonctionne, mais le fichier intermédaire est très volumineux (89 Mo pour seulement 75 itérations) et environ 8 x plus volumineux que le fichier vidéo (.dv) généré en sortie

Quelqu'un a une idée ???

Merci

PS : Pour ceux que ça intéresserait, je compte diffuser le tout prochainement sous licence GPL (V2 ou 3 ... pas encore décidé), même s'il s'agit d'une petite appli sans grandes prétentions.
  • # Correction

    Posté par  . Évalué à 1.

    Bon, vous aurez corrigé ... il manque l'incrémentation de i dans la boucle while du code python ...

    désolé
    • [^] # Re: Correction

      Posté par  . Évalué à 1.

      y a un truc bien sympa dans python pour faire ca:
      for idx,obj in enumerate(some_list):
        assert( some_list[idx] == obj )
      

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.