Ankündigung

Einklappen

Sammelbestellung ETS5-UPGRADE gestartet...

Die Sammelbestellung für ETS5 UPGRADE ist gestartet. Infos unter: Link
Mehr anzeigen
Weniger anzeigen

Achtung: Python Version bei Smarthome.py unter Linux (non Raspi)

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

    Achtung: Python Version bei Smarthome.py unter Linux (non Raspi)

    Guten Tag zusammen,

    ich habe gestern verzweifelt versucht per CLI auf meine Items zuzugreifen. Anmelden per telnet ging ohne Probleme. Ein "ls" listete auch brav alle items auf. Allerdings brachte ein "ls env" die Verbindung sofort zum Abbruch.
    Im Nebenfenster lief smarthome.py -d so das ich dort auch direkt die Bestätigung bekam. Leider gab es für den Abbruch keine weiteren sachdienlichen Hinweise. Was also tun?

    Mein System ist als virtuelle Maschine installiert unter einem Ubuntu 13.10. Dort ist ein Python 3.3.2 zu finden.
    Das fertige Image für den Raspberry Pi beinhaltet ein Python 3.2.3.

    Auf meiner Testmaschine mit dem Raspberry und dem Image habe ich ebenfalls den CLI ausprobiert und es klappte.

    Da ich in Python nicht wirklich zuhause bin fiel es mir zunächst schwer die Problemstelle einzukreisen. Zunächst habe ich per try: except: versucht die Codezeilen sukzessive einzukapseln und mit logger.debug entsprechende Meldungen auszugeben. Dabei bin ich auf ein Ärgernis gestoßen: hasattr() schluckt sämtliche exceptions und ein try...except drumherum ist wirkungslos. Ich habe dann nach Studium verschiedener Ansätze eine Methode via getattr() innerhalb eines try...except Konstruktes gefunden die funktioniert. Leider war das wohl nur die halbe Miete. Nach einigem weiteren suchen bin ich auf item.type() gekommen und nach vergleichen der changelog bei Python 3.3.x haben die dort wohl die Rückgabewerte erweitert. Offensichtlich kommt der existierende Code an dieser Stelle nicht damit klar.

    Code:
    #Datei Plugins\cli\__init__.py
    #-----------------------------------
    
    class CLIHandler(lib.connection.Stream):
    ....
        def ls(self, path):
            if not path:
                for item in self.sh:
                    self.push("{0}\n".format(item.id()))
            else:
                item = self.sh.return_item(path)
                try:
                    # if item has no attrib 'id' then getattr will raise an AttributeError
                    foo =  getattr(item, 'id')
                    try:
                        if item.type():
                            self.push("{0} = {1}\n".format(item.id(), item()))
                        else:
                            self.push("{}\n".format(item.id()))
    
                    except:
                        self.push("{}\n".format(item.id()))
    
                    for child in item:
                        self.ls(child.id())
                        
                except AttributeError:
                    self.push("Could not find path: {}\n".format(path))
    Der Konstrukt item.type() wird in der Datei nur noch weitere zweimal verwendet. Da ich mich mit git überhaupt nicht auskenne aber gerne diesen Lösungsansatz und die Information über die Inkompatibilität weitergeben wollte habe ich das hier mal im Forum geschrieben und nicht als PN. Ich würde mich freuen, wenn die Experten dazu mal was sagen könnten...

    Gruß,
    Bernd


    #2
    Hi,

    am besten waere es, wenn du sowohl auf dem DevSystem sowie auf dem TargetSystem die gleiche Python Version installiert hast. Ich hab schon etwas Zeit bei der Portierung von 2.7.6 auf 2.7.3 etwas Zeit verbracht. Hab uebersehen, dass mein DevSystem 2.7.6 hatte und der Rasp 2.7.3. Am Besten synchron halten.

    Einfach aergerlich, aber die Problematik ist verstaendlich...
    Grueße....

    Kommentar


      #3
      Hallo Bernd,

      danke für die aufbereiteten Informationen. Ich schaue mit das an, wenn ich das Image aktualisiere.

      Bis bald

      Marcus

      Kommentar

      Lädt...
      X