Hy,
ist es irgendwie möglich, dass man in Python einen Shell Befehl ausführt?
Also bspw.:
sh /pfad/zu/einer/sh/datei.sh
?
Oder auch
sh /pfad/zu/einer/sh/datei.sh >/pfad/zu/einem/Ordner/logdatei.log
?
Und wenn ja, wie?
Gruß
detru
Anmeldungsdatum: Beiträge: 5733 |
Hy, ist es irgendwie möglich, dass man in Python einen Shell Befehl ausführt? Und wenn ja, wie? Gruß |
![]() Anmeldungsdatum: Beiträge: 1253 |
Natürlich. Schau dir das Model 'subprocess' an. €dit: |
(Themenstarter)
Anmeldungsdatum: Beiträge: 5733 |
Da ich ET:QW starten will, ist dieser *Prozess* nötig 😀 Das ganze soll eine Art Frontend für ET:QW werden, sprich: Mich nervt es einfach total, dass es dafür kein FrontEnd vom Hersteller gibt und sowas mit dem eigentlichen Spiel nicht möglich ist. Das wird mein erstes Python Projekt...ich denke, dass ist angemessen. (bin gerad dabei mit Glade die ungefähre Oberfläche zu erstellen und will jetzt erstmal dem Start Button eine Funktion zuweisen um erstmal zu sehen wie das geht etc.) Gruß *edit Popen ("/pfad/zur/Datei.sh", shell=true)
Popen ("/pfad/zur/Datei.sh >/log/Datei.log", shell=true)
|
![]() Anmeldungsdatum: Beiträge: 1253 |
Zumindest das Logs-Anschaun würde ich im Programm selbst machen und den Befehl zum editieren der autoexec.cfg mach bitte konfigurierbar. Ich will mir das Spiel demnächst auch mal besorgen 😉 subprocess aus der Standardbibliothek ist jedenfalls genau was zu suchst! |
(Themenstarter)
Anmeldungsdatum: Beiträge: 5733 |
ja das ist klar, im Notfall darf man auch im Code rumpfuschen 😉 aber sind meine beiden popen Befehle richtig?\^^ |
![]() Anmeldungsdatum: Beiträge: 79 |
Ich rufe externe Prozesse meist als popen3-objekte auf ( http://docs.python.org/lib/popen3-objects.html ) import popen2 out,in,err=popen2.popen3("ls") output=out.read() errors=err.read() #input=in.write() So kann man den output auslesen, obendrein fehlermeldungen abfangen (sind ja keine exceptions mehr, wenn sie aus zweiter Hand kommen) und sogar beliebige Eingabeaufforderungen beantworten. |
(Themenstarter)
Anmeldungsdatum: Beiträge: 5733 |
hey cool, danke Flint ☺ |
![]() Anmeldungsdatum: Beiträge: 1253 |
Und man soll subprocess benutzen. popen2 wird demnächst aus der Bibliothek entfernt. from subprocess import Popen, PIPE bufsize = 0 p = Popen(["mycmd", "myarg"], bufsize=bufsize, stdin=PIPE, stdout=PIPE, close_fds=True) (child_stdout, child_stdin) = (p.stdout, p.stdin)
So macht man das mittlerweile 😉 |
Anmeldungsdatum: Beiträge: 5244 Wohnort: Bochum |
Guck Dir mal die Argumente "stdout" etc. von subprocess.Popen an. Damit hat man bequemen Zugriff auf STDOUT und kann dann die Ausgabe parsen. Für so einfache Sachen ist sonst subprocess.call auch sehr nett. Damit hat man zwar keinen Zugriff auf STDOUT, aber man kann sehr einfach einen Befehl anschubsen und dessen returncode abfangen. Liebe Grüße |
(Themenstarter)
Anmeldungsdatum: Beiträge: 5733 |
*schnief* ich fand das andere besser...is ja voll kompliziert 😲 from subprocess import Popen, PIPE bufsize = 0 p = Popen(["/opt/etqw/etqw.sh"], bufsize=bufsize, stdin=PIPE, stdout=PIPE, close_fds=True) (child_stdout, child_stdin) = (p.stdout, p.stdin)
|
![]() Anmeldungsdatum: Beiträge: 1253 |
Schau dir die Doku an, die hab ich verlinkt... Da steht alles besser, als ich es erklären könnte. |
Anmeldungsdatum: Beiträge: 5244 Wohnort: Bochum |
detructor15 hat geschrieben:
Du willst ja gar nichts an stdin senden, also kannst Du das IMO auch weglassen. Und warum man zum Schluss noch mal p.stdout und p.stdin in andere Variablen packt ist mir auch noch nicht ganz klar, ich bin bisher ohne ausgekommen. Da Du nur ein Argument hast, musst Du das nicht als Liste schreiben. bufsize=0 sollte übrigens die Standardeinstellung sein. Die Funktion von close_fds müsste ich auch noch mal erklärt bekommen, die könnte durchaus ihren Sinn haben, der sich mir aber noch nicht erschließt. Also sollte das genügen (ungetestet): from subprocess import Popen, PIPE p = Popen("/opt/etqw/etqw.sh", stdout=PIPE) # parse p.stdout ret = p.wait() |
(Themenstarter)
Anmeldungsdatum: Beiträge: 5733 |
werd ich nich wirklich schlau draus...da is nichts erklärt, nur ein paar Befehle hingedonnert und das wars...da ist selbst Java Benutzerfreundlicher... @Fredo Danke für die Aufklärung\^^ Gruß |
![]() Anmeldungsdatum: Beiträge: 1253 |
|
![]() Anmeldungsdatum: Beiträge: 1253 |
detructor15 hat geschrieben:
Und jetzt frage ich mich ernsthaft: Warum denkst du eigentlich, dass ausgerechnet DU völlig ohne lesen der Doku auskommst? Was denkst, wofür wird Doku wohl geschrieben sein? Für Leute, die zu blöd auf einen Link zu klicken? |