Seite 1 von 1

Java Programm aus Python starten und beenden: subprozess ?

Verfasst: Freitag 11. April 2014, 14:51
von mephisto-online
Hallo zusammen,

in meinem Python-Programm benutze ich ein Java/Swing-Programm über Socket als Grafik-Server. Wenn der "Server" nicht läuft, starte ich ihn mit os.command():

Code: Alles auswählen

import socket
import os

SERVER_HOST = "127.0.0.1"
SERVER_PORT = 12000
SERVER_START_COMMAND = 'cd '+SERVER_PATH+'\n'+'java -jar Server.jar '+str(SERVER_PORT)+'&\n'

    def connect_server(self):
        server_port = SERVER_PORT
        server_host = SERVER_HOST
        try:
            self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            self.sock.settimeout(3)
            server_address = (server_host, server_port)
            print(server_address)
            print ('Verbinde mit: %s port %s' % server_address)
            self.sock.connect((server_address))
            return True
        except:
            print('Verbindung fehlgeschlagen !\n versuche, Server zu starten ...')
            try:
                os.system(SERVER_START_STR)
                self.connect_server()
            except:
                print('Server nicht gefunden !')
            return False

Natürlich könnte ich den Server bei Beendigung des Python-Programms auf dem gleichen Weg z.B. mit os.system(ps -n | grep Server...kill...) beenden. Das ist aber bestimmt keine sonderlich elegante Lösung.

Wäre da nicht eine rein pythonische Lösung mit subprozess eine bessere Idee ?

Würde der "Server"-Prozess beim Aufruf per subprozess nicht automatisch bei Beendigung des Python-Programms beendet ?

Grüße
m-o

Anm.: Das mit den exceptions mache ich glaube ich auch noch nicht ganz korrekt ... :oops:

Re: Java Programm aus Python starten und beenden: subprozess

Verfasst: Freitag 11. April 2014, 19:05
von Sirius3
@mephisto-online: »subprocess« ist schonmal eine gute Idee. Exceptions, die nur den Fehler, den man erwartet, abfangen, auch. Stirbt der Elternprocess erbt dessen Vorfahre die Kindprozesse. Der "Server" könnte sich aber auch beenden, wenn sich die Verbindung schließt, dann hättest Du das Problem nicht.

Re: Java Programm aus Python starten und beenden: subprozess

Verfasst: Freitag 11. April 2014, 20:45
von mephisto-online
@Sirius3
Wenn ich also den Python-Programm-Prozess beende und ich habe daraus vorher den Java-Server-Prozess mit Subprozess gestartet, dann erbt der Python-Interpreter den Prozess ? Soetwas wie "subprozess beenden" gibt es wohl nicht. Wie sich das in den References liest, ist subprozess nur dafür da, an die exception-pipe des aufgerufenen Prozesses zu gelangen, oder doch nicht ?

Aber die Idee, einfach den Server (per Socket-Befehl) sich selbst beenden zu lassen, scheint mir da die beste Lösung zu sein.

Danke !

Re: Java Programm aus Python starten und beenden: subprozess

Verfasst: Samstag 12. April 2014, 09:11
von darktrym
Popen kennt doch kill bzw. terminate.

Re: Java Programm aus Python starten und beenden: subprozess

Verfasst: Samstag 12. April 2014, 09:54
von Sirius3
@darktrym: falls das Programm unerwartet abbricht, wird es mit dem "kill" etwas schwierig.

Re: Java Programm aus Python starten und beenden: subprozess

Verfasst: Samstag 12. April 2014, 11:08
von darktrym
Wieso? Die PID ist bekannt und nachprüfen ob noch was in der Richtung läuft sollte auch gehen. Im schlimmsten Fall schießt man irgendwas ab oder löst eine Exception aus.

Re: Java Programm aus Python starten und beenden: subprozess

Verfasst: Donnerstag 17. April 2014, 14:02
von mephisto-online
Mit subprozess.Popen() funzt das genauso gut wie mit os.system(). Im Fehlerfall muss ich den Prozess so oder so manuell abschiessen ...

Danke nochmal !

Re: Java Programm aus Python starten und beenden: subprozess

Verfasst: Donnerstag 17. April 2014, 14:33
von jerch
Hier nochmal der Hinweis, subprocess anstelle von os.system zu verwenden, wenn man die Implikationen von os.system nicht versteht (siehe `man system`).