Java Programm aus Python starten und beenden: subprozess ?

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
mephisto-online
User
Beiträge: 167
Registriert: Sonntag 29. September 2013, 17:05

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:
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
mephisto-online
User
Beiträge: 167
Registriert: Sonntag 29. September 2013, 17:05

@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 !
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

Popen kennt doch kill bzw. terminate.
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@darktrym: falls das Programm unerwartet abbricht, wird es mit dem "kill" etwas schwierig.
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

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.
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
mephisto-online
User
Beiträge: 167
Registriert: Sonntag 29. September 2013, 17:05

Mit subprozess.Popen() funzt das genauso gut wie mit os.system(). Im Fehlerfall muss ich den Prozess so oder so manuell abschiessen ...

Danke nochmal !
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Hier nochmal der Hinweis, subprocess anstelle von os.system zu verwenden, wenn man die Implikationen von os.system nicht versteht (siehe `man system`).
Antworten