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

Probleme mit subprocess unter Linux

Beitragvon snakeseven » Freitag 17. März 2006, 19:01

Hi,
wenn ich
[code=]/usr/bin/lame --preset tape /home/xx/Documents/test.wav /home/xx/Documents/test.mp3[/code]
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=]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[/code]

Kennt einer den Grund ?
Gruss, Seven
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Beitragvon modelnine » Freitag 17. März 2006, 19:10

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

Re: Probleme mit subprocess unter Linux

Beitragvon gerold » Freitag 17. März 2006, 19:40

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

Beitragvon snakeseven » Samstag 18. März 2006, 08:12

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

[code=]args = '/usr/bin/lame --preset tape /home/xx/Documents/test.wav /home/xx/Documents/test.mp3'
proz = subprocess.Popen(args,shell=True)[/code]

Die zweite Variante führt zu folgender Ausgabe:

[code=]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[/code]

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

Beitragvon modelnine » Samstag 18. März 2006, 12:35

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.
Benutzeravatar
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Beitragvon Joghurt » Samstag 18. März 2006, 14:50

Code: Alles auswählen

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

Code: Alles auswählen

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

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]