Seite 1 von 1
Python Skript in Python Skript ausführen
Verfasst: Montag 5. Juli 2010, 13:39
von Vermillion
Hallo Zusammen
Ich habe ein Programm, dass unter anderem andere Python Skripte aufruft. In den Python Skripten gibt es Ausgaben die ich dann in meinem "Hauptprogramm" anzeigen lassen möchte. Allerdings weiss ich nicht wie das geht. Ich dachte da gäbe es einen Parameter für den Interpreter aber ich hab im Internet nichts dazu gefunden...
Hier mal ein Stück Code:
Code: Alles auswählen
outPut = os.system("python "+fullDocumentPath)
print(outPut)
outPut liefert mir immer 0 (wahrscheinlich für das erfolgreiche Ausführen des Skriptes). Wie bekomme ich es hin, dass ich die Ausgaben sehe die mein Script macht?
Re: Python Skript in Python Skript ausführen
Verfasst: Montag 5. Juli 2010, 13:51
von cofi
Indem du `subprocess` nutzt, was man eh tun sollte:
http://docs.python.org/library/subprocess.html
Re: Python Skript in Python Skript ausführen
Verfasst: Montag 5. Juli 2010, 14:06
von Vermillion
Okay, vielen Dank für den Hinweis. So funktionierts.
Code: Alles auswählen
from subprocess import Popen,PIPE
p = Popen("python \""+ fullDocumentPath+"\"",shell=True,stdin=PIPE,stdout=PIPE)
outPut = p.stdout.read()
Re: Python Skript in Python Skript ausführen
Verfasst: Montag 5. Juli 2010, 14:17
von Rebecca
Besser:
Code: Alles auswählen
p = Popen(["python", fullDocumentPath], stdin=PIPE, stdout=PIPE)
Auf
Shell=True sollte man verzichten, wenn man's nicht unbedingt braucht.
Re: Python Skript in Python Skript ausführen
Verfasst: Montag 5. Juli 2010, 14:22
von Vermillion
Okay ich scheine Shell=True nicht zu brauchen.
So sieht das ganze noch besser aus, danke. Werde ich gleich so übernehmen
Was ist der Unterschied zwischen Shell=False und deiner Variante?
Re: Python Skript in Python Skript ausführen
Verfasst: Montag 5. Juli 2010, 14:26
von Rebecca
Vermillion hat geschrieben:Was ist der Unterschied zwischen Shell=False und deiner Variante?
Gar keiner.

Der Defaultwert von
Shell ist
False.
Re: Python Skript in Python Skript ausführen
Verfasst: Montag 5. Juli 2010, 15:45
von Dav1d
Ich nehme an du verwendest Linux.
On Unix, the return value is the exit status of the process encoded in the format specified for wait(). Note that POSIX does not specify the meaning of the return value of the C system() function, so the return value of the Python function is system-dependen
Anstatt "python" würde ich sys.executable verwenden und
Code: Alles auswählen
p.stdout.read()
# ändern zu
stdoutdata, stderrdata = p.communicat()
Re: Python Skript in Python Skript ausführen
Verfasst: Dienstag 6. Juli 2010, 07:55
von Vermillion
Dav1d hat geschrieben:Ich nehme an du verwendest Linux.
genau.
Dav1d hat geschrieben:
Anstatt "python" würde ich sys.executable verwenden und
Code: Alles auswählen
p.stdout.read()
# ändern zu
stdoutdata, stderrdata = p.communicat()
Wenn ich das recht verstanden habe kann ich mit deinem Code einen möglichen Deadlock verhindern falls ich rechenintensive Skripte ausführe.
Allerdings scheint es nicht gut zu sein wenn man mit grösseren Datenvolumen zu tun hat da diese im Memory zwischengespeichert werden.
Dann hätte ich Laufzeitfehler die gegebenenfalls durch das Programm verursacht werden in
stderrdata?
Und wenn alles geklappt hat hätte ich die erwartete Ausgabe in
stdoutdata?
Danke für den Tipp und sorry für die Fragen aber ich möchte gerne verstehen was mein Code macht.
Re: Python Skript in Python Skript ausführen
Verfasst: Dienstag 6. Juli 2010, 08:30
von Hyperion
Ich werfe mal etwas banales in den Raum: Wieso importierst Du nicht das Script, welches Du ausführen möchtest und rufst dann die gewünschte Funktion direkt auf? Das ist doch imho der bessere Weg, wenn man es so einfach realisieren kann. (Ich denke die aller meisten GUI-Frontends für Konsolentools nutzen ja auch direkt die Libs und rufen eben nicht immer ein Shell-Kommando auf - nur mal als State-of-the-art Beispiel)
Re: Python Skript in Python Skript ausführen
Verfasst: Dienstag 6. Juli 2010, 09:38
von Vermillion
Habe ich mir auch schon überlegt. Ist allerdings in diesem Fall nicht sehr nützlich.
Schliesslich müsste ich jedes mal meinen Code ändern wenn ein neues Skript dazu kommt oder eines gelöscht wird (was bei diesem Programm oft der Fall sein wird...)
Re: Python Skript in Python Skript ausführen
Verfasst: Dienstag 6. Juli 2010, 09:45
von Hyperion
Vermillion hat geschrieben:Habe ich mir auch schon überlegt. Ist allerdings in diesem Fall nicht sehr nützlich.
Schliesslich müsste ich jedes mal meinen Code ändern wenn ein neues Skript dazu kommt oder eines gelöscht wird (was bei diesem Programm oft der Fall sein wird...)
Hm... musst Du so ja auch

Aber ok, ich wollte es ja nur mal anmerken, da man oft den Wald vor lauter Bäumen nicht sieht

Re: Python Skript in Python Skript ausführen
Verfasst: Dienstag 6. Juli 2010, 10:35
von mkesper
Hmm, kannst du nicht einfach alle Skripte in dem Ordner importieren und eine feste Methode darin ausführen?
Es ist leider
ein bißchen Trickserei nötig, da import nur feste Strings verarbeitet.
Re: Python Skript in Python Skript ausführen
Verfasst: Dienstag 6. Juli 2010, 11:20
von cofi
Fuer mich macht es da mehr Sinn auf das `imp`-Modul zuzugreifen, als auf `__import__`:
http://docs.python.org/library/imp.html
Ausserdem fuehlt es sich nicht so schaebig an

Re: Python Skript in Python Skript ausführen
Verfasst: Dienstag 6. Juli 2010, 12:32
von Vermillion
Nach einem kurzen ersten Blick auf __import__ und das imp Modul muss ich sagen, dass letzteres "schöner" aussieht. Werde mir aber trotzdem beide Möglichkeiten genauer ansehen. Danke für den Hinweis.
Re: Python Skript in Python Skript ausführen
Verfasst: Dienstag 6. Juli 2010, 15:09
von mkesper
Oder unter Python >= 2.7: importlib.import_module().
Kaum zu glauben, dass es das erst jetzt gibt...