pythonscript von einem anderen aufrufen

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
alpha
User
Beiträge: 195
Registriert: Freitag 23. Mai 2003, 23:24
Wohnort: Ulm

Hallo Leute,

mal wieder ne Frage von mir.
Kann ich ein Pythonscript von einem anderen Pyscript aufrufen und wenn ja wie?
ich würde das ja gerne mit popen machen, vertstehe aber das prinzip von dem popen immer noch nicht so richtig.
Wieso muss ich das zum Beispiel hier so ineinanderschachteln?

Code: Alles auswählen

ch_out,ch_in,ch_err=popen2.popen3('ping 127.0.0.1')
Ich meine die beiden popen in einer Zeile..???

Ausserdem mus ich mitbekommen, wenn in dem aufgerufenen
Script ein Fehler auftritt.

Würde mich über eine Antwort freuen, danke.

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

Hi alpha,

wo hast du das

Code: Alles auswählen

ch_out,ch_in,ch_err=popen2.popen3('ping 127.0.0.1')
denn her?

sollte eigentlich wohl

Code: Alles auswählen

import os
ch_out,ch_in,ch_err = os.popen3('ping 127.0.0.1')
heissen.

Du kannst ein Pythonscript auch einfach importieren, dann wird es auch ausgeführt, ausser der Teil der durch

Code: Alles auswählen

if __name__ == "__main__":
nur im Falle, daß das Script direkt gestartet wurde ausgeführt wird.


Gruß

Dookie
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Dookie hat geschrieben:wo hast du das

Code: Alles auswählen

ch_out,ch_in,ch_err=popen2.popen3('ping 127.0.0.1')
denn her?
Hi. Dass stammt wohl von mir hier aus dem Forum, als ich noch popen2 benutzt habe... popen2 ist ein Modul, dass dieselbe Funktion bereithält, allerdings die Pipes in anderer Reihenfolge zurückgibt. Der Vorteil ist, dass unter Linux Popen3 und Popen4 als Klassen bereitstehen und man davon ableiten kann.

Und Fehler kannst du aus ch_err auslesen. Würde ich auch zuerst machen, bevor ich ch_out auslese...

Milan
alpha
User
Beiträge: 195
Registriert: Freitag 23. Mai 2003, 23:24
Wohnort: Ulm

Hallo,

ich habe es jetzt ausprobiert und leider funktioniert
popen3 wohl nur bei nicht python Programmen.
Ich kann damit den notepad, nicht aber den Pythoninterpreter
starten.
folgende Zeile geht:

Code: Alles auswählen

ch_out,ch_in,ch_err = os.popen3("notepad.exe")
diese dagegen nicht:

Code: Alles auswählen

ch_out,ch_in,ch_err = os.popen3("c:\programme\python23\python.exe")
Wie kann das sein???

Gruß
alpha
alpha
User
Beiträge: 195
Registriert: Freitag 23. Mai 2003, 23:24
Wohnort: Ulm

Noch ein Nachtrag...

Import geht nicht, da ich von dem einen Script erst das andere
modifizieren will und danach starten...

alpha
alpha
User
Beiträge: 195
Registriert: Freitag 23. Mai 2003, 23:24
Wohnort: Ulm

Habe weiter herumexperimentiert...

Hier noch ein Phänomen:
C:\vss\vlo\opc-client>starter.py
<open file 'notepad.ex', mode 'w' at 0x007E8FA0>
<open file 'notepad.ex', mode 'r' at 0x007EC7A0>
<open file 'notepad.ex', mode 'r' at 0x007EC9A0>

C:\vss\vlo\opc-client>starter.py
<open file 'notepad.exe', mode 'w' at 0x007E8FA0>
<open file 'notepad.exe', mode 'r' at 0x007EC7A0>
<open file 'notepad.exe', mode 'r' at 0x007EC9A0>

Dies ist die Konsolenausgabe, die ich eben bekommen habe.
Wieso bekomme ich die gleichen Rückgabewerte von
popen3 obwohl das File oben (notepad.ex) ganz bestimmt nicht
existiert. Ich hätte jetzt hier einen Fehler erwartet.

alpha
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

alpha hat geschrieben:Noch ein Nachtrag...

Import geht nicht, da ich von dem einen Script erst das andere modifizieren will und danach starten...
Hi. Das ist in meinen Augen kein Argument, denn normalerweise sollte man statt so zu modifizieren, besser mit paramentern auskommen, dann ist das nicht nötig. Beschreib daher bitte mal genauer, was du vorhast.
Und: selbst wenn modifiziert werden müsste, würde das auch so gehen, dann halt einfach nach dem modifizieren importieren, bzw wenn schon gemacht reload(modul) benutzen.

Und: auch das Python ausführen geht, du musst halt nur angeben, was er ausführen soll...

Code: Alles auswählen

>>> o,i,e=popen2.popen3('c:\python23\python.exe c:\Temp\\test.py')
>>> o.read()
'[1, 2, 3]\n'
@Dookie: ist mir gerade aufgefallen: wenn man os statt popen2 benutzt, muss mann auch die Reihenfolge der Ausgabepipes ändern. Es muss ch_in,ch_out,ch_err = os.popen3('ping 127.0.0.1') heißen.

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

Hi Milan,

hab ich auch gerade bemerkt :)


Gruß

Dookie
alpha
User
Beiträge: 195
Registriert: Freitag 23. Mai 2003, 23:24
Wohnort: Ulm

Ich habe vor ein script von einem anderen aus zu starten. Dieses
soll mitbekommen wenn das zu startende Script einen Fehler hat, damit
ich diesen dem Benutzer mitteilen kann. Der Benutzer schreibt dieses 2.Script. Es soll so von mir sichergestellt werden, daß mein Programm
nicht hängenbleibt, wenn der benutzer ein falsches "Rezeptscript" (das in Python geschrieben ist) erstellt hat. Ich muß ihm also möglicht genau mitteilen wo sein Fehler ist. Am einfachsten wäre es natürlich wenn ich an den Pythonfehlertext rannkäme.
Ich hoffe meine Problematik ist jetzt etwas klarer.
Grüsse und schonmal danke für dei Antworten.

alpha
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Hi. Dann spricht doch nix gegen ein popen. Ich wäre aber zu faul, den Path zum Interpreter jedesmal neu rauszusuchen und würde eher das hier machen:

Code: Alles auswählen

import sys,traceback
scripttext="""print unbekannt""" #Das ist das Script, das gespeichert und ausgeführt werden soll.
scriptname="test"
datei=file("%s.py"%scriptname,"w")
datei.write(scripttext)
datei.close()

try:
    execfile("%s.py"%scriptname)
except:
    t=sys.exc_info()
    text=("").join(traceback.format_exception(t[0],t[1],t[2]))
    print "Es gab einen Fehler:"
    print text
else:
    print "Es gab keinen Fehler"
Damit fängst du alle vorkommenden Fehler ab und kannst sie bequem formatiert ausgeben.

Milan
alpha
User
Beiträge: 195
Registriert: Freitag 23. Mai 2003, 23:24
Wohnort: Ulm

Danke milan, das werde ich doch gleich mal ausprobieren, lass dich dann
wissen wie es lief:-)
alpha
alpha
User
Beiträge: 195
Registriert: Freitag 23. Mai 2003, 23:24
Wohnort: Ulm

Hallo Milan,

alles klar, es scheint zu funktionieren. Jetzt verstehe ich nur noch nicht
was das
"%s.py"%scriptname..

in der Zeile

Code: Alles auswählen

datei=file("%s.py"%scriptname,"w")
macht. Speziell das %-Zeichen verstehe ich nicht in diesem Zusammenhang. Vieleicht kannst Du mir da noch auf die Sprünge helfen.
Ansonsten vielen Dank für die tolle Hilfe
alpha
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hi alpha,

probiers doch einfach in der Konsole aus.

Code: Alles auswählen

>>> scriptname = "Test"
>>> print "%s.py"%scriptname
Test.py
Gruß

Dookie
Antworten