Wenn ich
Code: Alles auswählen
servermodul.DoConnect('myCoolScript')Gruß
pSy
Code: Alles auswählen
servermodul.DoConnect('myCoolScript')Code: Alles auswählen
# -*- coding: iso-8859-1 -*-
import socket
import sys
import threading
#Socket- und Portspeicher
_sock=[None]
_port=[None]
#Verbinden
def DoConnect(progName, funktion=None, parameter=None):
    """
    progname =      The identified name for the programm which connect you. Must be a name,
                    that will really differ beetwen programs.
    funktion =      The funktion which will be started, when the programm will double opened
    parameter =     The parameter for the funktion
    """
    if not progName or type(progName) != str:
        raise ValueError, 'Value must be a string and may be not empty'
    HOST = "localhost"
    for newport in xrange(65000, 65536):
        if not _port[0]:
            port = newport
        else:
            port = _port[0]
        try:
            s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            s.bind((HOST, port))
            s.listen(1)
            _sock[0] = s
            _port[0] = port
            #start serverthread
            serv = Miniserver(s, progName, port, funktion, parameter)
            serv.start()
            print "Port %s gestartet"% port
            break
        except:
            try:
                s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                s.connect((HOST, port))
                s.send(progName)
                data=s.recv(1024)
                s.close()
                if data != progName and progName != "!%END%!":
                    continue
                else:
                    return "LOCK"
            except:
                continue
#Verbindung trennen
def DoDisconnect():
    """ Break up the connected socket"""
    DoConnect("!%END%!")
#Server
class Miniserver(threading.Thread):
    def __init__(self, sock, progName, port, funktion, parameter):
        """
        sock =          The new socket
        progname =      The identified name for the programm which connect you. Must be a name,
                        that will really differ beetwen programs.
        port =          The reserved port for the socket
        funktion =      The funktion which will be started, when the programm will double opened
        parameter =     The parameter for the funktion
        """
        threading.Thread.__init__(self)
        self.s = sock
        self.progName= progName
        self.port= port
        self.funktion = funktion
        self.parameter = parameter
    def run(self):
        """Let run the thread to observe the started programs"""
        while 1:
            client, addr = self.s.accept()
            port = client.getsockname()[1]
            client.send(self.progName)
            progName = client.recv(1024)
            client.close()
            if self.port == port and self.progName != progName and progName != "!%END%!":
                continue
            if self.port == port and progName == "!%END%!":
                print "Port %s beendet"% port
                break
            if self.port == port and self.funktion:
                self.funktion(self.parameter)
                print "Übergebene Funktion des Ports %s wurde gestartet"% port
if __name__ == "__main__":
    pass
Code: Alles auswählen
server=modul.DoConnect("Programmname")
if server == "LOCK":
      sys.exit()
Code: Alles auswählen
modul.DoDisconnect()
Code: Alles auswählen
server=modul.DoConnect("Programmname", funktion, parameter)
if server == "LOCK":
      sys.exit()
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# For Python3.x
import sys
import socket
import threading
# Socket- und Portspeicher
_sock=[None]
_port=[None]
# Verbinden
def DoConnect(progName, funktion=None, parameter=None):
    """
    progname =      The identified name for the programm which connect you. Must be a name,
                    that will really differ beetwen programs.
    funktion =      The funktion which will be started, when the programm will double opened
    parameter =     The parameter for the funktion
    """
    if not progName or type(progName) != str:
        raise ValueError (e, 'Value must be a string and may be not empty')
    HOST = "localhost"
    for newport in range(65000, 65536):
        if not _port[0]:
            port = newport
        else:
            port = _port[0]
        try:
            s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            s.bind((HOST, port))
            s.listen(1)
            _sock[0] = s
            _port[0] = port
            # start serverthread
            serv = Miniserver(s, progName, port, funktion, parameter)
            serv.start()
            print('Port %s gestartet' % port)
            break
        except:
            try:
                s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                try:
                    s.connect((HOST, port))
                except socket.error:
                    return
                s.send(progName)
                data=s.recv(1024)
                s.close()
                print(progName, data)
                if data != progName and progName != "!%END%!":
                    continue
                else:
                    return "LOCK"
            except TypeError:
                return "LOCK"
# Verbindung trennen
def DoDisconnect():
    """ Break up the connected socket"""
    DoConnect("!%END%!")
# Server
class Miniserver(threading.Thread):
    def __init__(self, sock, progName, port, funktion, parameter):
        """
        sock =          The new socket
        progname =      The identified name for the programm which connect you. Must be a name,
                        that will really differ beetwen programs.
        port =          The reserved port for the socket
        funktion =      The funktion which will be started, when the programm will double opened
        parameter =     The parameter for the funktion
        """
        threading.Thread.__init__(self)
        self.s = sock
        self.progName = progName
        self.port = port
        self.funktion = funktion
        self.parameter = parameter
    def run(self):
        """Let run the thread to observe the started programs"""
        while 1:
            client, addr = self.s.accept()
            port = client.getsockname()[1]
            try:
                client.send(self.progName)
            except TypeError:
                break
            progName = client.recv(1024)
            client.close()
            if self.port == port and self.progName != progName and progName != "!%END%!":
                continue
            if self.port == port and progName == "!%END%!":
                print('Port %s beendet' % port)
                break
            if self.port == port and self.funktion:
                self.funktion(self.parameter)
                print('Übergebene Funktion des Ports %s wurde gestartet' % port)
if __name__ == "__main__":
    passCode: Alles auswählen
# Kontrollfunktion gegen doppeltes Starten des Programmes
import gui_sock_control as modul
gui_work = os.path.join(os.path.dirname(__file__), 'gui_work.py')
server = modul.DoConnect(gui_work)
if server == "LOCK":
      sys.exit()Code: Alles auswählen
modul.DoConnect()Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# For Python3.x
import sys
import socket
import threading
import atexit
# Socket- und Portspeicher
_sock=[None]
_port=[None]
# Exit abfangen
def OnClose(port):
    if port == _port[0]:
        DoDisconnect()
# Verbinden
def DoConnect(progName, funktion=None, parameter=None):
    """
    progname =      The identified name for the programm which connect you. Must be a name,
                    that will really differ beetwen programs.
    funktion =      The funktion which will be started, when the programm will double opened
    parameter =     The parameter for the funktion
    """
    if not progName or type(progName) != str:
        raise ValueError (e, 'Value must be a string and may be not empty')
    HOST = "localhost"
    for newport in range(65000, 65536):
        if not _port[0]:
            port = newport
        else:
            port = _port[0]
        try:
            s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            s.bind((HOST, port))
            s.listen(1)
            _sock[0] = s
            _port[0] = port
            # start serverthread
            serv = Miniserver(s, progName, port, funktion, parameter)
            serv.start()            
            atexit.register(OnClose, port)
            print('Port %s gestartet' % port)
            break
        except:
            try:
                s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                try:
                    s.connect((HOST, port))
                except socket.error:
                    return
                s.send(progName)
                data=s.recv(1024)
                s.close()
                print(progName, data)
                if data != progName and progName != "!%END%!":
                    continue
                else:
                    return "LOCK"
            except TypeError:
                return "LOCK"
# Verbindung trennen
def DoDisconnect():
    """ Break up the connected socket"""
    DoConnect("!%END%!")
# Server
class Miniserver(threading.Thread):
    def __init__(self, sock, progName, port, funktion, parameter):
        """
        sock =          The new socket
        progname =      The identified name for the programm which connect you. Must be a name,
                        that will really differ beetwen programs.
        port =          The reserved port for the socket
        funktion =      The funktion which will be started, when the programm will double opened
        parameter =     The parameter for the funktion
        """
        threading.Thread.__init__(self)
        self.s = sock
        self.progName = progName
        self.port = port
        self.funktion = funktion
        self.parameter = parameter
    def run(self):
        """Let run the thread to observe the started programs"""
        while 1:
            client, addr = self.s.accept()
            port = client.getsockname()[1]
            try:
                client.send(self.progName)
            except TypeError:
                break
            progName = client.recv(1024)
            client.close()
            if self.port == port and self.progName != progName and progName != "!%END%!":
                continue
            if self.port == port and progName == "!%END%!":
                print('Port %s beendet' % port)
                break
            if self.port == port and self.funktion:
                self.funktion(self.parameter)
                print('Übergebene Funktion des Ports %s wurde gestartet' % port)
if __name__ == "__main__":
    pass
 
  
 Habe mit Tkinter kaum Erfahrungen; arbeite mit wxPython. Dort ist es wichtig das Close-Event anzufangen und das Programm dann mit sys.exit() zu beenden. Dann werden auch die in atexit.register(...) registrierten Funktionen gestartet.Note: the functions registered via this module are not called when the program is killed by a signal not handled by Python, when a Python fatal internal error is detected, or when os._exit() is called.