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
os.popen() bei falschem Aufruf
Sorry, war ein Schriebfählör, muß 2.2 heißen.joerg hat geschrieben: ...Python 2.1 ...
-
- 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:
Gruß
Dookie
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
-
- 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 wiehalte ich für nicht angebracht, weil OS - abhängig.
Hans
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
Hans
-
- 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? ) finden.
Ausserdem gibts ja auch noch os.path, womit sich eine solche Konstruktion wie
platformunabhängig zu
machen lässt
Gruß
Dookie
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? ) 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
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)
Gruß
Dookie
-
- 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
Hans
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
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