Python Skript in Python Skript ausführen

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
Vermillion
User
Beiträge: 10
Registriert: Mittwoch 30. September 2009, 06:38

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?
Zuletzt geändert von Vermillion am Montag 5. Juli 2010, 13:52, insgesamt 1-mal geändert.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Indem du `subprocess` nutzt, was man eh tun sollte: http://docs.python.org/library/subprocess.html
Vermillion
User
Beiträge: 10
Registriert: Mittwoch 30. September 2009, 06:38

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()
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

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.
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Vermillion
User
Beiträge: 10
Registriert: Mittwoch 30. September 2009, 06:38

Okay ich scheine Shell=True nicht zu brauchen.
So sieht das ganze noch besser aus, danke. Werde ich gleich so übernehmen :D

Was ist der Unterschied zwischen Shell=False und deiner Variante?
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Vermillion hat geschrieben:Was ist der Unterschied zwischen Shell=False und deiner Variante?
Gar keiner. :) Der Defaultwert von Shell ist False.
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

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()
the more they change the more they stay the same
Vermillion
User
Beiträge: 10
Registriert: Mittwoch 30. September 2009, 06:38

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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Vermillion
User
Beiträge: 10
Registriert: Mittwoch 30. September 2009, 06:38

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...)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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 :-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

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.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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 ;)
Vermillion
User
Beiträge: 10
Registriert: Mittwoch 30. September 2009, 06:38

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.
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Oder unter Python >= 2.7: importlib.import_module().
Kaum zu glauben, dass es das erst jetzt gibt...
Antworten