Seite 2 von 2

Re: SocketServer und epoll

Verfasst: Dienstag 12. Februar 2013, 00:30
von der_Angler
es wird heiß, ich kann es spüren ...

Code: Alles auswählen

pi@raspberrypi ~ $ python RaPiServer2.py
Traceback (most recent call last):
  File "RaPiServer2.py", line 129, in <module>
    pollster.register(Switch(light_bed_switch, light_bed), select.EPOLLIN | select.EPOLLET)
TypeError: argument must be an int, or have a fileno() method.

Re: SocketServer und epoll

Verfasst: Dienstag 12. Februar 2013, 09:27
von Sirius3
der_Angler hat geschrieben:es wird heiß, ich kann es spüren ...
naja, freu Dich nicht zu früh.

das sind nur so Kleinigkeiten, die beim Remote-Debuggen nach und nach auftauchen.
»fileno« fehlt:

Code: Alles auswählen

class Switch(object):
    def __init__(self, switch, light):
        self.switch = switch
        self.light = light
        self.fileno = switch.fileno
        asyncore.socket_map[switch.fileno()] = self

Re: SocketServer und epoll

Verfasst: Dienstag 12. Februar 2013, 12:06
von der_Angler
@Sirius3
Sagmal, du hättest kein Interesse an einem RaspberryPi?

Weil du hilfst mir hier dermaßen, ich frag mich die ganze Zeit wie ich mich bedanken kann.
Und da ich hier zuhause 3-4 Raspberrys rumliegen habe würde ich dir einfach einen schenken, quasi als Dankeschön und zum Testen :)

Re: SocketServer und epoll

Verfasst: Dienstag 12. Februar 2013, 19:25
von der_Angler
naja, freu Dich nicht zu früh.
Hmm, da hattest du wohl recht, ein neuer Fehler

Code: Alles auswählen

pi@raspberrypi ~ $ python RaPiServer2.py
Traceback (most recent call last):
  File "RaPiServer2.py", line 134, in <module>
    readwrite(fd, flags)
  File "RaPiServer2.py", line 117, in readwrite
    obj.handle_error()
AttributeError: 'int' object has no attribute 'handle_error'

Re: SocketServer und epoll

Verfasst: Dienstag 12. Februar 2013, 20:23
von pillmuncher
der_Angler hat geschrieben:PS: Python Einsteiger Buch ist bereits bestellt.
Welches? Hoffentlich keines von Galileo.

Re: SocketServer und epoll

Verfasst: Dienstag 12. Februar 2013, 23:00
von Sirius3
Ich hoffe, Du verstehst noch einigermaßen, wie das Programm aufgebaut ist,
falls nicht, fragen! und nicht nur Fehlermelden¡

epoll nimmt zwar file-like-Objekte entgegen, gibt aber nur Filehandles zurück :(
Deshalb noch ein kleiner epoll-Wrapper

Code: Alles auswählen

class EPoll(object):
    def __init__(self):
        self.epoll = select.epoll()
        self.fdmap = {}
        
    def register(self, obj, flags):
        fd = obj.fileno()
        self.epoll.register(fd, flags)
        self.fdmap[fd] = obj

    def unregister(self, obj):
        fd = obj.fileno()
        del self.fdmap[fd]
        self.epoll.unregister(fd)
        
    def poll(self):
        evt = self.epoll.poll()
        for fd, flags in evt:
            yield self.fdmap[fd], flags

if __name__ == "__main__":
    with exported(GPIOPin(pin_bed, direction=Out)) as light_bed, \
        exported(GPIOPin(pin_bed_switch, Pin.In, Pin.Rising)) as light_bed_switch, \
        exported(GPIOPin(pin_nightlight, direction=Out)) as light_nightlight:

        light_bed.value = 0
        light_nightlight.value = 0

        pollster = EPoll()
        pollster.register(Server(("",54321),pollster), select.EPOLLIN)
        pollster.register(Switch(light_bed_switch, light_bed), select.EPOLLIN | select.EPOLLET)
        while True:
            evt = pollster.poll()
            for obj, flags in evt:
                readwrite(obj, flags)

Re: SocketServer und epoll

Verfasst: Mittwoch 13. Februar 2013, 00:05
von der_Angler
naja, ich blicke so halbwegs durch.

Ich versuche halt immer auf die schnelle deine Änderungen und poste das Ergebnis damit du entsprechendes Feedback hast.

Wenn alles richtig läuft setze ich mich hin und gehe jede Zeile einzel durch.
Die prinzipielle Funktionsweise verstehe ich aber schon.

Okay, habe das Programm entsprechend geändert.

Nach dem Starten erscheint:

Code: Alles auswählen

pi@raspberrypi ~ $ python RaPiServer2.py
something went wrong
was aber nicht schlimm ist weil der Hardware-Button funktioniert.

Drücke ich den Taster geht die LED an, bzw. wieder aus.
Trotzdem erscheint jedes mal wenn ich den Taster drücke die Fehlermeldung "something went wrong" - das sieht dann so aus

Code: Alles auswählen

pi@raspberrypi ~ $ python RaPiServer2.py
something went wrong
something went wrong
something went wrong
something went wrong
Beflügelt vom Erfolg wollte ich dann auch mal die Netzwerkfunktionen testen und hab die Handy-App gestartet.
Leider kam direkt beim starten der App (und damit beim verbinden mit dem Skript) ein Fehler und das Skript hat auch nicht auf die Netzwerkbefehle reagiert.

Code: Alles auswählen

pi@raspberrypi ~ $ python RaPiServer2.py
something went wrong
something went wrong
something went wrong
something went wrong
Connected from ('192.168.2.113', 43029)
error: uncaptured python exception, closing channel <__main__.Server listening :54321 at 0x4056b4e0> (<type 'exceptions.AttributeError'>:'module' object has no attribute 'EPOLLNVAL' [RaPiServer2.py|readwrite|107])
error: uncaptured python exception, closing channel <__main__.Client connected 192.168.2.113:43029 at 0x4056b7d8> (<type 'exceptions.AttributeError'>:'module' object has no attribute 'EPOLLNVAL' [RaPiServer2.py|readwrite|107])
Ds verstehen fällt mir zum teil noch schwer, für ein Anfänger ist das Thema aber auch durchaus komplex.
Mein Glück das ich nen paar andere Programmiersprachen kenne und sich alle ähnlich sind.

Seltsamerweise fand ich die erste Version des Skripts von dir (die ohne epoll) einfacher zu verstehen.
Mit epoll habe ich irgendwie Schwierigkeiten.

Re: SocketServer und epoll

Verfasst: Mittwoch 13. Februar 2013, 01:00
von BlackJack
`select.EPOLLNVAL` gibt es nicht.

Re: SocketServer und epoll

Verfasst: Mittwoch 13. Februar 2013, 01:24
von der_Angler
okay wenn ich in der entsprechenden Zeile folgendes

Code: Alles auswählen

        if flags & (select.EPOLLHUP | select.EPOLLERR | select.EPOLLNVAL):
durch

Code: Alles auswählen

        if flags & (select.EPOLLHUP | select.EPOLLERR | select.POLLNVAL):
austausche dann scheint tatsächlich alles zu funktionieren.
Ich bekomme zwar immernoch die Meldung

Code: Alles auswählen

pi@raspberrypi ~ $ python RaPiServer2.py
something went wrong
something went wrong
something went wrong
something went wrong
Connected from ('192.168.2.113', 48439)
something went wrong
something went wrong
something went wrong
something went wrong
wenn ich die Hardware Taste drücke, aber es funktioniert :)

Sollte also anstatt "EPOLLNVAL" -> "POLLNVAL" der ganze Fehler gewesen sein?
Und ist es okay das einfach so abzuändern?

Und schon mal vielen Dank an alle und an Sirius im Besonderen :)

Re: SocketServer und epoll

Verfasst: Mittwoch 13. Februar 2013, 06:39
von Sirius3
Das something went wrong ist die sehr einfache Fehlerbehandlung.
Du solltest hier:

Code: Alles auswählen

def readwrite(obj, flags):
    try:
        if flags & select.EPOLLIN:
            obj.handle_read_event()
        if flags & select.EPOLLOUT:
            obj.handle_write_event()
        if flags & select.EPOLLPRI:
            obj.handle_expt_event()
        if flags & (select.EPOLLHUP | select.EPOLLERR | select.EPOLLNVAL):
            obj.handle_close()
    except socket.error, e:
        if e.args[0] not in asyncore._DISCONNECTED:
            obj.handle_error()
        else:
            obj.handle_close()
    except asyncore._reraised_exceptions:
        raise
    except:
        obj.handle_error()
vor allen die letzten beiden Zeilen noch erweitern, damit Du auch
weißt was für eine Exception, samt Traceback aufgetreten ist.
Es werden nämlich alle Fehler (auch falsch geschriebene Variablennamen)
einfach geschluckt.
Aber das überlass ich dir als Hausaufgabe.

Re: SocketServer und epoll

Verfasst: Donnerstag 14. Februar 2013, 00:06
von der_Angler
Hmm, dann will ich mich am Wochenende mal hinsetzen und werde über den Hausaufgaben brüten.

Ich hoffe ich kann dann am Montag eine gute Lösung posten :)

Re: SocketServer und epoll

Verfasst: Dienstag 5. März 2013, 01:24
von der_Angler
So,
ich habe mal versucht mich in das Thema "Error-Handling" einzulesen, muss aber sagen das es im Augenblick noch meinen Horizont übersteigt.
Ich konnte also meine Hausaufgabe nicht machen, da das Script aber trotzdem tut was es soll scheint der Fehler auch nicht weiter schlimm zu sein.

ich nutze mittlerweile 2 x Versionen. Eine auf dem RaspberryPi mit Hardware-Buttons (und Fehlermeldung) und eine auf dem Media-Server ohne Buttons (und ohne Fehler).
Dank dir bin ich jetzt soweit das ich eine USB-Steckdosenleiste, diverse Funkempfänger von HomeEasy und xbmc bequem übers Handy steuern kann.

Dafür wollte ich mich noch einmal herzlich bedanken :)

Re: SocketServer und epoll

Verfasst: Sonntag 23. März 2014, 16:26
von der_Angler
Hallo,

nach langer Zeit muss ich mich mal wieder melden.

Erst einmal danke an das Script, das funktioniert soweit unter Linux sehr gut :)

Dafür tausend Dank!!!

Aber, unter Windows mit python 3.2 sieht die Welt leider ganz anders aus, versuche ich das Script unter Windows laufen zu lassen, dann bekomme ich jede Menge bezüglich ".epoll()" - es scheint als kenne python unter windows diesen Befehl nicht.

Re: SocketServer und epoll

Verfasst: Sonntag 23. März 2014, 16:32
von Sirius3
@der_Angler: falls Du die Dokumentation gelesen hast, wüstest Du, dass es epoll nur unter Linux gibt.

Re: SocketServer und epoll

Verfasst: Sonntag 23. März 2014, 17:17
von der_Angler
okay, dann habe ich das schon einmal richtig verstanden ... hatte sowas gelesen aber gedacht ich hätte es falsch verstanden.

Hmm, okay, dann muss ich in dem Fall also ein Script für Linux und eins für Windows nutzen?

Schade, da ich unter Windows mit Eclipse entwickle, da bekomme ich dann auch in zukunft weiter Fehler angezeigt.
Trotzdem erst mal danke.