Python und Bash

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Antworten
berkutta
User
Beiträge: 2
Registriert: Dienstag 3. November 2015, 11:55

Hallo Zusammen,

Stehe momentan etwas auf dem Schlauch. Ich möchte mir auf einem Linux Rechner ein Backend basteln, welches einen Prozess im Bash startet und die Ausgabe davon Zeilenweise an Python zurückgibt. Das ganze soll auch umgekehrt funktionieren, dass Python eine Zeile ins Bash schreiben kann. Natürlich auf den Prozess. Prozess ist ein Java Gameserver.

Die Klasse os mit os.popen ist mir bekannt. Jedoch kann ich da nur eine Zeile "abschicken" und dann das Resultat holen.

Gibt es für mein Vorhaben evtl. schon eine fertige Klasse welche ich noch nicht kenne?

Berkutta
BlackJack

@berkutta: Entweder `subprocess.Popen` aus der Standardbibliothek oder das `pexpect`-Modul wenn man dem externen Prozess ein echtes (Pseudo)Terminal vorspielen muss.
berkutta
User
Beiträge: 2
Registriert: Dienstag 3. November 2015, 11:55

Hi BlackJack

Jap, das ist bereits ziemlich in die Richtung die ich benötige. Der Haken den ich an pexpect sehe ist, dass er nicht Zeilenweise lesen kann sondern nur auf von mir definierte Linien/Strings hört und dann weiter macht. Und popen kommt scheinbar nicht mit einem Prozess zurecht, welcher "leben" bleibt. Und das ist ja genau das was mein Prozess tutet.

Berkutta
BlackJack

@berkutta: Die `spawn`-Objekte von `pexpect` haben auch eine `readline()`-Methode und man könnte auch auf Zeilenenden warten. `pexpect` würde ich aber nur nehmen wenn das externe Programm tatsächlich nur mit einem (Pseudo)Terminal funktionieren will, denn…

…`subprocess.Popen` ist doch gerade dafür da um mit einem ”lebenden” Prozess zu kommunizieren. Oder wie meinst Du das mit dem ”leben” bleiben? Womit `Popen` nicht klar kommt ist wenn die Gegenseite Ausgaben puffert und man die deswegen gar nicht oder zu spät auslesen kann. Das wäre ein Grund warum man auf `pexpect` ausweichen müsste wenn man das der Gegenseite nicht abgewöhnen kann. Und das eigentlich auch nur weil die Ausgaben auf ein (Pseudo)Terminal üblicherweise nur zeilengepuffert werden, wenn man das nicht anders einstellt.
Antworten