Händler in threading.Thread soll Argumente bekommen....

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
DMD-OL
User
Beiträge: 315
Registriert: Samstag 26. Dezember 2015, 16:21

hi
ich versuche den beiden klassen Programm und Datentransfer die beiden pfade speicherort und path_grund zu übergeben...
Soll heißen:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import Tkinter
import os
import socket
import SocketServer
import threading
import json

class Datentransfer(SocketServer.BaseRequestHandler):

    def __init__(self,speicherort,path_grund):
        self.speicherort = speicherort
        self.path_grund = path_grund

    def handle(self):

        #--> Wie kann ich speicherort und path_grund hier her übergeben? :(
        print speicherort
        print path_grund
        #------------------


class Programm():

    def __init__(self,speicherort,path_grund):
        self.speicherort = speicherort
        self.path_grund = path_grund

    def main(self):

        backwin = Tkinter.Tk()
        backwin.title('DMD-DATA.soft')
        backwin.state('zoomed')
        backwin.configure(background='black')

        get_IP = [TCP_IP for TCP_IP in socket.gethostbyname_ex(socket.gethostname())[2] if not TCP_IP.startswith("127.")][:1]
        if TCP_IP.startswith("127."):
            print "Kein W-LAN"

        else:
            TCP_PORT = 9090
            server = SocketServer.TCPServer((TCP_IP, TCP_PORT), lambda:Datentransfer(speicherort,path_grund))
            thread = threading.Thread(target=server.serve_forever)
            thread.start()

        def quit(backwin=None):

            try:
                server.shutdown()
                server.server_close()
            except:
                pass
            backwin.destroy()

        b2 = Tkinter.Button(backwin, text=("\nBEENDEN\n"), justify='center',command=lambda:quit(backwin))
        b2.place(relx=.495, rely=.6, anchor="c")
        backwin.protocol("WM_DELETE_WINDOW", quit)

        backwin.mainloop()


if __name__ == '__main__':

    speicherort = os.environ['PROGRAMDATA']
    path_grund = speicherort+'\\DMD-Data.soft\\SYSTEM'

    datentransfer = Datentransfer(speicherort,path_grund)

    mat_zeit = Programm(speicherort,path_grund)
    mat_zeit.main()
die übergabe der beiden pfade funktioniert aber nur für programm einwandfrei.
datentransfer wird in einem threading.Thread übergeben, in dem im vollen programmcode dann auch der händler vorhanden ist (hab ich hier jetzt
mal weggelassen). könnte mir vielleicht jemand helfen, die beiden pfade an beide klassen zu übergeben? bin mittlerweile kurz vorm aufgeben :(

ich erhalte immer den fehler:

Code: Alles auswählen

Exception happened during processing of request from ('10.17.11.44', 52768)
Traceback (most recent call last):
  File "C:\Python27\Lib\SocketServer.py", line 295, in _handle_request_noblock
    self.process_request(request, client_address)
  File "C:\Python27\Lib\SocketServer.py", line 321, in process_request
    self.finish_request(request, client_address)
  File "C:\Python27\Lib\SocketServer.py", line 334, in finish_request
    self.RequestHandlerClass(request, client_address, self)
TypeError: <lambda>() takes no arguments (3 given)
----------------------------------------
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@DMD-OL: »BaseRequestHandler« haben ein »server«-Attribut, mit dem man auf das Serverobjekt, das den Request verarbeitet, zugreifen kann, Deine Attribute kannst Du also im Server vorhalten.

Zeile 13ff: die Handler-Klasse sollte kein »__init__« haben, da die schon von der Basisklasse bereitgestellt wird, nur »handle« muß überschrieben werden.

Zeile 38: »get_IP« ist der Name einer Funktion, Du verwendest ihn aber für eine Liste. Diese Liste wird aber gar nicht verwendet, sondern Du benutzt die Variable einer ListComprehension, was zum Glück in Python 3 nicht mehr funktioniert und für Python 2 nicht verwendet werden sollte. Wenn Du also keine List-Comprehension verwenden willst, dann nimm eine normale for-Schleife.

Ein normaler Rechner kann viele Gateways haben, eins davon für den Server auszusuchen, ist seltsam, Server werden fast immer an »0.0.0.0« gebunden.

Zeile 67: Pfade werden mit »os.path.join« zusammengesetzt.

Zeile 69: »datentransfer« wird nicht benutzt.
DMD-OL
User
Beiträge: 315
Registriert: Samstag 26. Dezember 2015, 16:21

danke sirius,
ich habe es jetzt so verstanden:
ich habe zeile 13ff rausgenommen, datentransfer = Datentransfer(speicherort,path_grund) rausgenommen und
lambda:Datentransfer(speicherort,path_grund) in Datentransfer geändert.
hab viel ausprobiert und es funktioniert jetzt einwandfrei. danke noch einmal.
so richtig vollständig habe ich das aber leider mit den klassen noch nicht verstanden:

Code: Alles auswählen

import os

class Programm():

    def __init__(self,speicherort,path_grund):
        self.speicherort = speicherort
        self.path_grund = path_grund

    def main(self):
        print speicherort
        print path_grund



if __name__ == '__main__':

    speicherort = os.environ['PROGRAMDATA']
    path_grund = speicherort+'\\DMD-Data.soft\\SYSTEM'

    mat_zeit = Programm(speicherort,path_grund)
    mat_zeit.main()
wieso funktioniert das, obwohl die zeile "class Programm():" eben nicht class Programm(speicherort,path_grund): lautet?????
irgentwie wird das mit mat_zeit übergeben?????
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das funktioniert weil du globale Variablen anlegst, auf die Python in der Methode main zugreift.

In dem Moment wo du so vorgehst, wie man vorgehen sollte, naemlich

Code: Alles auswählen

def main():
    speicherort = os.environ['PROGRAMDATA']
    path_grund = speicherort+'\\DMD-Data.soft\\SYSTEM'

    mat_zeit = Programm(speicherort,path_grund)
    mat_zeit.main()

if __name__ == '__main__':
    main()
fliegt dir das mit Karacho um die Ohren.
DMD-OL
User
Beiträge: 315
Registriert: Samstag 26. Dezember 2015, 16:21

tja, ist es grad. funktioniert nämlich doch nicht, da ich den RequestHandler in der Klasse Datentransfer vergessen habe :(
Antworten