Ankündigung

Einklappen
Keine Ankündigung bisher.

Import Error bei eigenem Plugin

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Import Error bei eigenem Plugin

    Hallo zusammen,

    vielleicht kann mir mal einer der erfahrerenen Plugin-Autoren auf die Sprünge helfen.
    Ich habe mir ein Script geschrieben, dass ich jetzt gerne in ein sh.py plugin überführen möchte.

    Dazu habe ich mir mal das kurze Tutorial im Wiki zu Gemüte geführt.

    Das Plugin soll sich auf einer Internetseite einloggen und dort Daten extrahieren. Diese sollen dann für Items im sh zur Verfügung stehen. Soweit so einfach.
    Für den Login auf der Seite verwende ich MechanicalSoup.
    In meinem Script funktioniert das einwandfrei. Sobald ich MechanicalSoup im Plugin inkludiere bekomme ich dort nach einer Weile folgenden Fehler im sh.log:

    Code:
    ERROR    sh.gc        Method sh.gc exception: No module named '_tkinter', please install the python3-tk package
    Traceback (most recent call last):
      File "/usr/lib/python3.4/tkinter/__init__.py", line 39, in <module>
        import _tkinter
    ImportError: No module named '_tkinter'
    
    During handling of the above exception, another exception occurred:
    
    Traceback (most recent call last):
      File "/usr/local/smarthome/lib/scheduler.py", line 358, in _task
        obj()
      File "/usr/local/smarthome/bin/smarthome.py", line 508, in _maintenance
        references = sum(self._object_refcount().values())
      File "/usr/local/smarthome/bin/smarthome.py", line 539, in _object_refcount
        obj = getattr(module, sym)
      File "/usr/local/lib/python3.4/dist-packages/six.py", line 90, in __get__
        result = self._resolve()
      File "/usr/local/lib/python3.4/dist-packages/six.py", line 113, in _resolve
        return _import_module(self.mod)
      File "/usr/local/lib/python3.4/dist-packages/six.py", line 80, in _import_module
        __import__(name)
      File "/usr/lib/python3.4/tkinter/__init__.py", line 41, in <module>
        raise ImportError(str(msg) + ', please install the python3-tk package')
    ImportError: No module named '_tkinter', please install the python3-tk package
    Habe alles soweit auskommentiert, dass mein Plugin erst mal rein gar nichts tut. Nur Variablen anlegen. Und ein paar Debug ausgaben. Nach ein paar Sekunden erst tauch dann der Fehler auf.

    Hat jemand eine Idee?


    #2
    Super ... ohne den Quellcode des Plugins kann man nur raten ....

    Lesen als solches funktioniert aber bei Dir?
    ImportError: No module named '_tkinter', please install the python3-tk package
    Und zur Einstimmung vielleicht mal das hier beherzigen:
    https://knx-user-forum.de/forum/supp...fehlerbehebung


    Umgezogen? Ja! ... Fertig? Nein!
    Baustelle 2.0 !

    Kommentar


      #3
      Ja ... Lesen funktioniert im allgemeinen bei mir ganz gut, und bei dir?

      Ich poste hier nicht, weil ich nicht verstanden habe, was der Fehler bedeutet. Das sollte aus dem Text oben auch hervor gehen.

      Das Problem ist: Ich weiß nicht, wo tkinter überhaupt includiert wird.
      Ich inkludiere es nicht, BeautifulSoup inkludiert es nicht. Es ist gar nicht im System vorhanden und außerhalb von sh.py funktioniert das script ja auch ohne TK.
      Vor allem frage ich mich, warum der Fehler erst nach ein paar Sekunden kommt. Anhand von Debug ausgaben sehe ich dass mein Plugin schon längst ausgeführt wird.

      Kommentar


        #4
        ... sorry, aber ich muß da Jumi schon recht geben... Du schreibst ja selbst das Du nicht weißt wo das Zeugs herkommt, das hatten wir doch auch schon bei dem Thema six.py....

        Wie sollen Dir denn andere helfen wenn Du weder den Source-Code beistellst noch erklärst was Du da auf Deiner Büchse zusammengekocht hast?

        Bzgl. "das sollte aus dem Text oben auch hervor gehen" >> Tut es nicht und Dein Post hat auch eher den Charakter einer Müllverklappung...

        Wo es herkommt >> grep auf smarthome-Verzeichnis nach tkinker... und dann mal weg mit dem ganzen Non-Standard und bei Default anfangen....


        Kommentar


          #5
          Okay, zurück auf los. Diesmal ein paar mehr Informationen. Ich gebe ja zu dass beim zweiten lesen vielleicht ein bisschen wenig drin stand. Habe das quasi zwischen Tür und Angel geschrieben und gehofft, dass jemand das Phänomen kennt.
          • grep nach tinker bzw. Tinker liefert im smarthome.py Verzeichnis nichts. Auch nicht nach gdbm (siehe unten)
          • Der Code schau momentan nur so aus:
          • Code:
            	#!/usr/bin/env python3
            	
            	import logging
            	from datetime import datetime, timedelta
            	import mechanicalsoup
            	
            	logger = logging.getLogger('')
            	
            	class NibeUplink():
            	  def __init__(self, smarthome, nibe_email, nibe_password, nibe_system):
            	    logger.warn('Init NibeUplink')
            	    self._sh = smarthome
            	    self.nibe_email = nibe_email
            	    self.nibe_password = nibe_password
            	    self.nibe_system = nibe_system
            	    self.login_url = "https://www.nibeuplink.com/Welcome"
            	    self.service_url = "https://www.nibeuplink.com/System/"+self.nibe_system+"/Status/ServiceInfo"
            	
            	  def run(self):
            	    self.alive = True
            	
            	  def stop(self):
            	    self.alive = False
            	
            	  def parse_item(self, item):
            	    if 'nibe_reg' in item.conf:
            	      reg=item.conf['nibe_reg']
            	      return self.update_item
            	    else:
            	      return None
            	
            	  def update_item(self, item, caller=None, source=None, dest=None):
            	    logger.warn('NibeUplink: update_item()')
            	    return None
          • Das plugin soll Anlagendaten von NibeUplink ziehen und bereitstellen.
          • Ich habe das ganze das ganze prototypisch als stand-alone .py-Script zusammengebastelt, da funktioinert es ohne Fehler und ohne den Versuch tk oder gdbm zu laden.
          Der Root-Fehler schein ein anderer zu sein:
          Code:
          Init SmartHome.py 1.1.976.dev
          2015-07-09 10:31:31 WARNING  Main         Init NibeUplink
          2015-07-09 10:31:41 ERROR    sh.gc        Method sh.gc exception: No module named '_gdbm', please install the python3-gdbm package
          Traceback (most recent call last):
            File "/usr/lib/python3.4/dbm/gnu.py", line 4, in &lt;module&gt;
              from _gdbm import *
          ImportError: No module named '_gdbm'
          
          During handling of the above exception, another exception occurred:
          
          Traceback (most recent call last):
            File "/usr/local/smarthome/lib/scheduler.py", line 358, in _task
              obj()
            File "/usr/local/smarthome/bin/smarthome.py", line 508, in _maintenance
              references = sum(self._object_refcount().values())
            File "/usr/local/smarthome/bin/smarthome.py", line 539, in _object_refcount
              obj = getattr(module, sym)
            File "/usr/local/lib/python3.4/dist-packages/six.py", line 90, in __get__
              result = self._resolve()
            File "/usr/local/lib/python3.4/dist-packages/six.py", line 113, in _resolve
              return _import_module(self.mod)
            File "/usr/local/lib/python3.4/dist-packages/six.py", line 80, in _import_module
              __import__(name)
            File "/usr/lib/python3.4/dbm/gnu.py", line 6, in &lt;module&gt;
              raise ImportError(str(msg) + ', please install the python3-gdbm package')
          ImportError: No module named '_gdbm', please install the python3-gdbm package
          Die Beschwerde über das fehlende Tkinter kam dann erst nachdem ich wohl gestern gdbm installiert hatte.
          Grep sagt mir, dass weder tkinter noch gdbm von sh.py inkludiert werden.

          six.py sagt mir erst mal nichts. Gehört aber wohl zum pip dazu? Ich habe aber mal testweise noch nach gdbm in usr/local/lib/python3.4/dist-packages gesucht und siehe da:

          Code:
          root@bananapi:/usr/local/smarthome# grep -R "gdbm" /usr/local/lib/python3.4/dist-packages/
          /usr/local/lib/python3.4/dist-packages/six.py:    MovedModule("dbm_gnu", "gdbm", "dbm.gnu"),
          Binary file /usr/local/lib/python3.4/dist-packages/__pycache__/six.cpython-34.pyc matches
          /usr/local/lib/python3.4/dist-packages/pip/_vendor/six.py:    MovedModule("dbm_gnu", "gdbm", "dbm.gnu"),
          Binary file /usr/local/lib/python3.4/dist-packages/pip/_vendor/__pycache__/six.cpython-34.pyc matches
          Sobald ich den import von MechanicalSoup raus nehme, kommt der Fehler nicht mehr. Das reine importieren reicht um den Fehler zu provozieren. Es muss kein Objekt aus der lib angelegt werden.
          Ich würde das ganze ja eigentlich auch gerne über einen "nackten" HTML Parser machen, aber lxml oder html.parser funktioinert die Anmeldung auf der Seite nicht.

          Kommentar


            #6
            Oki, nun kommen wir doch schon mal wieder ein paar Schritte weiter. Das ist die Krux mit dem einen oder anderem Python-Tool, da habe ich auch noch x Baustellen wo ich zwar standalone Code habe, es mir aber nicht gelingt diesen zu integrieren.

            Aber vielleicht nochmal einen Schritt zurück... Hast Du Dir mal andere Plugins bzgl. des Parsens angeschaut. Ich stand vor einem ähnlichem Problem mit meinen WR's und der Useranmeldung. Habe dann bspw. das SMA-Plugin für mich umgebaut. OK, ist nicht fertig und ich muß es ws. nochmal komplett neu schreiben, aber zumindest hat es mir supi geholfen um die ersten Gehversuche bzgl. des Auslesens hinzubekommen.

            Bzgl. den anderen Fehlern. Du hast hier anscheinend via PIP einiges noch nachinstalliert, was m.W. nicht für den Grundbedarf von SH notwendig ist. Da wird Ephem benötigt, anderes dann eher aufgrund von Plugins etc., hier habe ich dann bspw. "requests" oder "python-magic". Wenn es Dir also nicht ganz klar ist wo es wirklich benötigt wird würde ich empfehlen das paket wieder runterzunehmen.
            Habe allerdings eben noch einen Unterschied gemerkt wo ich nicht weiß ob es einen Unterschied macht. Bei mir werkelt SH noch mit Python 3.2 rum, nicht wie bei Dir mit 3.4. Da kann aber Marcus evtl. was zu sagen....

            Kommentar


              #7
              Eigentlich habe ich nur MechanicalSoup und Mechanize installiert. Letzteres wird aber nicht verwendet, das kann ich runter schmeißen.
              Vielleicht habe ich den Import-Mechanismus von Python nicht verstanden, aber warum wird denn überhaupt versucht ein Package zu importieren, dass weder von sh.py noch von meinem Plugin verwendet wird? Gibt es da so etwas wie einen autoloader der hier vielleicht amok läuft?

              Hast du einen Code-Schnipsel herum fliegen, wo ich mir das Einloggen mal anschauen kann? Python ist mehr oder weniger Neuland für mich.

              Auf die Python-Version habe ich ehrlich gesagt nicht geachtet. Ich habe einfach nach und nach das System auf einem BananaPi aufgesetzt (sh.py, knxd, smartvisu).

              Kommentar


                #8
                Wie gesagt, schau Dir am besten mal das SMA-Plugin an. Die Login-Routine konnte ich 1zu1 so übernehmen und mußte lediglich an den ausgelesenen Werten bei meinen WR's rumschrauben. Einfach duplizieren mit eigenem Namen mal anstarten.

                Kommentar


                  #9
                  Irgendwie verträgt sich six.py nicht mit dem der smarthome.py.
                  six.py wird wiederum von mechanicalsoup aufgerufen.
                  Ohne da wirklich durchzusteigen vermute ich einen Namenskonflikt von __name__ in Zeile 305 von six.py und 537 von smarthome.py.

                  Also doch eher ein Fall für Marcus ... der versteht das vielleicht .
                  Umgezogen? Ja! ... Fertig? Nein!
                  Baustelle 2.0 !

                  Kommentar


                    #10
                    Hallo,

                    auch hier ist das Problem wieder die six.py. In dem Trace aus Post #5 sieht man es schön.
                    In Zeile 539 von /usr/local/smarthome/bin/smarthome.py wird getattr(module, sym) aufgerufen. Das wird, wieso auch immer, von dem Modul six.py zur Verfügung gestellt. Und dann gehts in die Hose.

                    is jetzt bist Du der von dem Problem betroffen ist. Bei mir hier mit Python 3.4 (auf einem FreeBSD) habe ich das Problem nicht. Ich denke es liegt an der Distri bzw. Deiner Umgebung.

                    Als Workaround könntest Du den Codeteil von Zeile 539 der /usr/local/smarthome/bin/smarthome.py modifizieren, damit der problematische Teil nicht aufgerufen wird. Oder eben die Umgebung fixen.

                    Bis bald

                    Marcus

                    Kommentar


                      #11
                      Hm ...
                      Weder der Patch an sh.py noch die Anpassung der Umgebung sind m.E. eine brauchbare Lösung. Dann funktioniert das ganze zwar bei mir, aber bei anderen ggf. nicht.
                      Ich hatte BeautifulSoup verwendet weil es für mich mit wenig Python Erfahrung schön einfach war.
                      Aus Gründen der Kompatibilität habe ich aber jetzt mal meinen Prototyp auf eher generische libs wie urllib und cookiejar umgebaut.
                      Ich werde das ganze dann mal ins Plugin schmeißen und schauen ob das weniger Probleme macht.
                      Danke schon mal für die Unterstützung.

                      Kommentar

                      Lädt...
                      X