Seite 1 von 1

Probleme mit subprocess unter Linux

Verfasst: Freitag 17. März 2006, 19:01
von snakeseven
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

Verfasst: Freitag 17. März 2006, 19:10
von modelnine
Probiers mal mit shell=True...

Re: Probleme mit subprocess unter Linux

Verfasst: Freitag 17. März 2006, 19:40
von gerold
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
:-)

Verfasst: Samstag 18. März 2006, 08:12
von snakeseven
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

Verfasst: Samstag 18. März 2006, 12:35
von modelnine
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).

Verfasst: Samstag 18. März 2006, 14:50
von Joghurt

Code: Alles auswählen

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

Code: Alles auswählen

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