Seite 1 von 1

os.popen() bei falschem Aufruf

Verfasst: Montag 2. Dezember 2002, 16:41
von joerg
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

Re: os.popen() bei falschem Aufruf

Verfasst: Montag 2. Dezember 2002, 16:43
von joerg
joerg hat geschrieben: ...Python 2.1 ...
Sorry, war ein Schriebfählör, muß 2.2 heißen.

Verfasst: Montag 2. Dezember 2002, 18:10
von Dookie
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

Verfasst: Montag 2. Dezember 2002, 18:13
von hans
Hallo Joerg,

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

Hans

Verfasst: Montag 2. Dezember 2002, 18:50
von Dookie
Hi Hans,

aber auch erst, wenn ein fehler auftritt.


Gruß

Dookie

Verfasst: Montag 2. Dezember 2002, 19:10
von hans
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

Verfasst: Montag 2. Dezember 2002, 20:01
von Dookie
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

Verfasst: Montag 2. Dezember 2002, 20:17
von hans
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

Verfasst: Mittwoch 4. Dezember 2002, 17:17
von joerg
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