os.popen() bei falschem Aufruf

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
joerg
User
Beiträge: 188
Registriert: Samstag 17. August 2002, 17:48
Wohnort: Berlin
Kontaktdaten:

Hallo Leute,

wenn ich popen() mit einem nichtexistierenden Befehl benutze, hätte ich eigentlich eine Exception erwartet. Bei mir gibt's aber nur eine Ausgabe (z.B.: sh: foo: command not found), aber mehr auch nicht (unter Linux mit Python 2.1). In der Annahme, daß es sich da um so eine neumodische Warning handelt, habe ich mit dem warnings-Modul etwas rumgespielt, um diese in eine Exception wandeln zu lassen, allerdings erfolglos.

Hat jemand eine Idee, wie ich schon beim popen()-Aufruf rauskriege, ob der Subprozess eigentlich gestartet werden konnte?

Danke!
Jörg
joerg
User
Beiträge: 188
Registriert: Samstag 17. August 2002, 17:48
Wohnort: Berlin
Kontaktdaten:

joerg hat geschrieben: ...Python 2.1 ...
Sorry, war ein Schriebfählör, muß 2.2 heißen.
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hi Joerg,

Du könntest höchstens das bei popen obergebene Argument vorab überprüfen mit:

Code: Alles auswählen

command = "/usr/bin/lynx"
if not os.access(command,os.F_OK & os.X_OK):
    raise "Befehl: "+command+"nicht ausführbar!"
... # hier kannst Du mit os.popen(command) den Befehl ausführen
 

Gruß

Dookie
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

Hallo Joerg,

nimm popen3(). Da bekommst du die Fehler in einem eigenen Kanal (_stderr) mitgeteilt.

Hans
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hi Hans,

aber auch erst, wenn ein fehler auftritt.


Gruß

Dookie
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

richtig! Aber es "tut ja nicht weh", weil du den prozess startets und in aller Ruhe das Ergebnis abwarten kannst.

Alternativ könntest du ja os.system() anwenden. Hier bekommst du Fehlercode zurück.

shellcommandos wie

Code: Alles auswählen

if [ -x /usr/bla/bla/bla ]; then
   exit 0
else
   exit 2
fi
halte ich für nicht angebracht, weil OS - abhängig.

Hans
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hi Hans,

ein Shellkommando auszuführen ist IMHO immer OS-Abhängig. Die wenigsten Kommanos wirst Du unter Unix/Linux, MacOS, BeOS, AmigaOS und (äh wie war der name nochmal? :wink: ) finden.
Ausserdem gibts ja auch noch os.path, womit sich eine solche Konstruktion wie

Code: Alles auswählen

if [ -x ~/bla/bla ]; then
   exit 0
else
   exit 2
fi
platformunabhängig zu

Code: Alles auswählen

import sys, os

command = os.path.join(os.getcwd(), "bla", "bla")
if os.access(command, os.F_OK & os.X_OK)
    print command+" kann ausgeführt werden!"
    sys.exit(0)
else:
    print command+" kann nicht ausgeführt werden!"
    sys.exit(2)
machen lässt


Gruß

Dookie
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

Auch ne nette Variante. Aber wenn ich dass so sehe, dann tendiere ich zu os.system() oder zu popen?() das ganze in einen try except Block ausführen und im Fehlerfall eine Exception manuell auslösen. Das kann aber durchaus Geschmacksache sein, habe nichts dagegen wenn jemand anders andere Lösungen bevorzugt.

Hans
joerg
User
Beiträge: 188
Registriert: Samstag 17. August 2002, 17:48
Wohnort: Berlin
Kontaktdaten:

Danke erstmal für die diversen Antworten.
Leider taugt nicht alles für meine Zwecke. Die Ausführungsrechte kann ich nicht prüfen, da ich nicht weiß, wo die Datei liegt. Und ob es überhaupt eine ausführbare Datei im $PATH gibt, wollte ich eben über das popen() rausfinden.

Hintergrund ist folgender: Eine Funktion soll eine Datei zum Lesen öffnen und das Fileobjekt zurückgeben, aber selber noch nichts lesen. Ist auf dem System (im Pfad) aber ein bestimmter Präprozessor vorhanden, soll dieser auch benutzt werden, um die Datei vorzufiltern. In dem Fall würde stattdessen eben das von popen('preproc datei', 'r') gelieferte Objekt zurückgegeben werden, aber eben nur, wenn das auch funktioniert.

Ich habe erstmal mittels commands.getstatusoutput und cStringIO einen Workaround gemacht, aber vielleicht schaue ich mir popen3 noch mal an, nur da müßte ich wohl den stderr-Output parsen...

Jörg
Antworten