Probleme mit subprocess unter Linux

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
snakeseven
User
Beiträge: 408
Registriert: Freitag 7. Oktober 2005, 14:37
Wohnort: Berlin
Kontaktdaten:

Hi,
wenn ich

Code: Alles auswählen

/usr/bin/lame --preset tape /home/xx/Documents/test.wav /home/xx/Documents/test.mp3
in der Konsole aufrufe, wird "Lame" aufgerufen und ein MP3 generiert.
Wenn ich das Gleiche aber über subprocess() erledigen will:

Code: Alles auswählen

import popen2,subprocess

commandotext = '/usr/bin/lame --preset tape /home/xx/Documents/test.wav /home/xx/Documents/test.mp3'
proz = subprocess.Popen(commandotext)
gibts eine Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "test.py", line 4, in ?
    proz = subprocess.Popen(commandotext)
  File "/usr/lib/python2.4/subprocess.py", line 558, in __init__
    errread, errwrite)
  File "/usr/lib/python2.4/subprocess.py", line 991, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory
Kennt einer den Grund ?
Gruss, Seven
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Probiers mal mit shell=True...
--- Heiko.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

snakeseven hat geschrieben:

Code: Alles auswählen

import popen2,subprocess

commandotext = '/usr/bin/lame --preset tape /home/xx/Documents/test.wav /home/xx/Documents/test.mp3'
proz = subprocess.Popen(commandotext)
Hi Seven!

Probier mal ob das funktioniert:

Code: Alles auswählen

args = "/usr/bin/lame --preset tape /home/xx/Documents/test.wav /home/xx/Documents/test.mp3"
executable = "/usr/bin/lame"
proz = subprocess.Popen(args = args, executable = executable)
lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
snakeseven
User
Beiträge: 408
Registriert: Freitag 7. Oktober 2005, 14:37
Wohnort: Berlin
Kontaktdaten:

Moin zusammen,
beide Möglichkeiten werden fehlerfrei ausgeführt, aber nur diese Variante erzeugt auch ein MP3:

Code: Alles auswählen

args = '/usr/bin/lame --preset tape /home/xx/Documents/test.wav /home/xx/Documents/test.mp3'
proz = subprocess.Popen(args,shell=True)
Die zweite Variante führt zu folgender Ausgabe:

Code: Alles auswählen

LAME version 3.91  (http://www.mp3dev.org/)

usage: /usr/bin/lame --preset tape /home/xx/Documents/test.wav /home/xx/Documents/test.mp3 [options] <infile> [outfile]

    <infile> and/or <outfile> can be "-", which means stdin/stdout.

Try:
     "/usr/bin/lame --preset tape /home/xx/Documents/test.wav /home/xx/Documents/test.mp3 --help"           for general usage information
 or:
     "/usr/bin/lame --preset tape /home/xx/Documents/test.wav /home/xx/Documents/test.mp3 --preset help"    for information on suggested predefined settings
     "/usr/bin/lame --preset tape /home/xx/Documents/test.wav /home/xx/Documents/test.mp3 --alt-preset help" for information on the seperate and very highly
                             tuned for quality predefined settings
 or:
     "/usr/bin/lame --preset tape /home/xx/Documents/test.wav /home/xx/Documents/test.mp3 --longhelp"
  or "/usr/bin/lame --preset tape /home/xx/Documents/test.wav /home/xx/Documents/test.mp3 -?"              for a complete options list

>Exit code: 0
Gruss, Seven
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Du gibst eine Kommandozeile an. Wenn shell=False ist, wird diese Kommandozeile nicht von der (Unix-)Shell interpretiert, welche nämlich den ganzen Kram mit ersetzen von Wildcards, etc. macht. Das bedeutet also, dass wenn Du nur einen String hast, das Programm auch nur ein Argument bekommt, nämlich als erstes Argument (den Programmnamen) die Shell-Zeile. Das kann nicht funktionieren.

Wenn Du drauf angewiesen bist unter Unix dass Argumente getrennt werden (durch Whitespace zwischen ihnen) bist Du entweder auf eigenes Parsing, oder aber auf die Shell angewiesen (shell=True).
--- Heiko.
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Code: Alles auswählen

args=("lame","--preset","tape",...)
oder halt

Code: Alles auswählen

subprocess.Popen(args=args.split(), executable=...)
Antworten