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__":
pass
Code: 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.