Seite 1 von 1

pythonscript von einem anderen aufrufen

Verfasst: Donnerstag 22. April 2004, 15:48
von alpha
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

Verfasst: Donnerstag 22. April 2004, 16:05
von Dookie
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

Verfasst: Donnerstag 22. April 2004, 18:02
von Milan
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

geht nicht

Verfasst: Freitag 23. April 2004, 08:09
von alpha
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

kein import möglich

Verfasst: Freitag 23. April 2004, 08:55
von alpha
Noch ein Nachtrag...

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

alpha

noch ein nachtrag

Verfasst: Freitag 23. April 2004, 09:18
von alpha
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

Re: kein import möglich

Verfasst: Freitag 23. April 2004, 15:17
von Milan
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

Verfasst: Freitag 23. April 2004, 15:21
von Dookie
Hi Milan,

hab ich auch gerade bemerkt :)


Gruß

Dookie

was ich möchte

Verfasst: Sonntag 25. April 2004, 08:11
von alpha
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

Verfasst: Sonntag 25. April 2004, 10:50
von Milan
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

Verfasst: Sonntag 25. April 2004, 14:08
von alpha
Danke milan, das werde ich doch gleich mal ausprobieren, lass dich dann
wissen wie es lief:-)
alpha

Verfasst: Montag 26. April 2004, 07:31
von alpha
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

Verfasst: Montag 26. April 2004, 10:16
von Dookie
Hi alpha,

probiers doch einfach in der Konsole aus.

Code: Alles auswählen

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

Dookie