ubuntuusers.de

Python versus Shell versus Mediainfo

Status: Gelöst | Ubuntu-Version: Xubuntu 14.04 (Trusty Tahr)
Antworten |

holgiB

Anmeldungsdatum:
11. November 2008

Beiträge: 528

Hallo *,

es ist mal wieder zum verzweifeln.

Hintergrund: Ich habe ein kleines Pythonscript, was die Audiokonvertierung von Videofiles nach MP3 parallelisiert. Das klappt soweit auch wunderbar. Jetzt wollte ich allerdings eine kleine Prüfung einbauen, wo die Abspiellänge von Quelldatei und Zieldatei verglichen wird um bei Abweichungen ein Fehlermeldung auszugeben.

Die Abspielzeit einer Mediendatei bekommt man wunderbar über MediaInfo mit diesem Aufruf:

1
mediainfo --Inform="Audio;%Duration%" <mediafile>

Verpacke ich das Ganze aber in eine Pythonfunktion und rufe das Kommando aus einem Pythonscript raus auf (os.popen, os.system, subprocess.popen, usw), dann kriege ich es in keinster Weise hin das "Standardout" von MediaInfo zu capturen und weiterzuverarbeiten. Das Umlenken von StdOut in der Commandline produziert leere Dateien und die Nutzung der Textausgabe von MediaInfo klappt ebenso nicht.

Ich habe auch schon mit verschiedenen Varianten im Script versucht das Mediainfo Kommando zu "quoten" um zu verhindern, dass irgendwelche Sonderzeichen beim Aufruf in der Shell gecastet werden, aber nix bringt Besserung. Es ist zum Mäusemelken....hat einer von euch schonmal etwas Ähnliches automatisiert ?

Ich bin schon kurz davor die Aufrufe jeweils von Python raus in eine Shelldatei zu verpacken und dann aufzurufen, aber kann doch nicht des Pudels Kern sein, oder ?

Danke & Gruß, Holger

barcc

Avatar von barcc

Anmeldungsdatum:
13. Juli 2007

Beiträge: 696

Wohnort: Dortmund

subprocess.Popen ist am besten für so etwas geeignet. Da brauchst du nichts quoten, denn da ist keine Shell beteiligt:

1
2
3
4
import subprocess
filename='Musik/Akrea/Lebenslinie/02 - Imperium.mp3'
stdout, stderr = subprocess.Popen(('mediainfo', '--Inform=Audio;%Duration%', filename), stdout=subprocess.PIPE).communicate()
print('Länge:', int(stdout.strip()))

holgiB

(Themenstarter)

Anmeldungsdatum:
11. November 2008

Beiträge: 528

Dank dir für deine Antwort ! Supi 👍

Hat funktioniert. Ich habe das Ganze jetzt noch in eine Funktion verpackt:

1
2
3
4
5
6
7
8
9
#!/usr/bin/python
# -*- coding: utf8 -*-
def GetTime (filename):
  import subprocess
  stdout, stderr = subprocess.Popen(('mediainfo', '--Inform=Audio;%Duration%', filename), stdout=subprocess.PIPE).communicate()
  return stdout.strip()

Playtime = GetTime ('/home/hb/Downloads/testvideo.mp4')
print Playtime

Allerdings verstehe ich nicht, was ich gestern mit subprocress.Popen verkehrt gemacht habe, weil mein Ergebnis immer leer war. Egal...Problem gelöst !

Edit: Ah, ich habe glaube ich meinen Fehler gefunden. Anstelle dem .communicate hatte ich .stdout.read verwendet. Laut offizielles Pythondoku scheint das zu Deadlockproblemen zu führen.

Antworten |