subprocess und avimerge

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Angeliter
User
Beiträge: 2
Registriert: Samstag 5. Oktober 2013, 16:56

Hallo Leute,
ich habe folgende Funktion geschrieben, die mir eine Liste von avi-Dateien zusammenfügen soll:

Code: Alles auswählen

def avimergef(aus, *ein):
  l = ["/usr/bin/avimerge", "-i"] + list(ein) + ["-o", aus]
#  p = subprocess.Popen(l, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
  p = subprocess.Popen(l)
  p.wait()
Eigentlich sollte es mit dem auskommentiertem Teil funktionieren, tut es aber nicht.
avimerge selber ist ein Programm, welches nach "-i" aufgeführte avis in die nach "-o" genannte Datei zusammenfügt.
So wie es oben steht funktioniert es auch, aber es wird eine Unmenge an Text mitausgegeben, was ich durch die Umlenkung vermeiden wollte. Allerdings geht es dann nicht mehr, was vermutlich an avimerge liegt.
Hat jemand eine Idee, was ich sonst machen kann?
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Angeliter hat geschrieben:was vermutlich an avimerge liegt
Vermutungen helfen hier nicht weiter, sondern nur ein rudimentäres Verständnis von Pipes.
Jedes Programm wird grundsätzlich mit drei offenen Filehandles gestartet, stdin, stdout und stderr.
Das können Dateien im Filesystem, Tastatur und Bildschirm oder eben Pipes sein.
Pipes haben wie der Name schon sagt, irgendwo einen Eingang und irgendwo einen Ausgang. Macht aber holt aber niemand etwas aus dem Ausgang heraus, wird solange was in den Eingang hineingestopft, bis die Röhre voll ist. Und dann hält das Programm, das den Eingang füllt, solange an, bis es wieder Platz gibt. Bei Dir wird nie etwas gelesen, also kann avimerge warten bis es schwarz wird.
Ausgabe, die man nicht will wird unter Unix traditionell nach '/dev/null' geleitet.
BlackJack

@Angeliter: `os.devnull` enthält den Dateinamen und ist plattformunabhängig.

Der `list()`-Aufruf auf `ein` ist unnötig, das ist schon eine Liste. Allerdings würde ich die API ändern und dort tatsächlich eine Liste übergeben. Die *-Magie ist dort nicht nötig.
Angeliter
User
Beiträge: 2
Registriert: Samstag 5. Oktober 2013, 16:56

Danke euch beiden. Mit os.devnull funktioniert es so wie es soll. Die API habe ich geändert.
stdin, stdout und stderr kenne ich so weit ich es bisher brauchte. Pipes nur so als Weiterleitung
in der Bash. Für mich war die Pipe so was wie eine Datei in der etwas hineingeschrieben wird und ein anderes Programm KANN es weiterverarbeiten. An eine Verstopfung habe ich nicht gedacht, muss mir das nochmal genauer ansehen.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Eine Pipe ist tatsächlich etwas wie eine Datei in die reingeschrieben wird :-) In C wird das ganz ähnlich wie eine Datei auch dargestellt, was wohl von der "alles ist eine Datei"-Philosophie der frühen Unices herrührt. Die Standardströme werden nämlich im Programm mit den File-Deskriptoren 0, 1 und 2 geöffnet. Vielleicht hast du schon mal in der Konsole den "Broken Pipe"-Fehler gesehen. Das ist wenn das empfangende Programm in der Pipeline diese Pipe (also dessen Stdin) wie eine Datei zumacht.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten