Ankündigung

Einklappen
Keine Ankündigung bisher.

Fehler bei Requirements-check in shpypi.py: - pymodbus MULTIPLE requirements

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

    Fehler bei Requirements-check in shpypi.py: - pymodbus MULTIPLE requirements

    Das habe ich jetzt schon einige Zeit im Log:

    Code:
    WARNING  lib.shpypi           - pymodbus: MULTIPLE requirements [{'min': '2.2.0'}, {'min': '3.0.2'}, {'min': '3.1.3'}]
    Wenn man das zusammenfast ist die Minimum Version 3.1.3. Da sehe ich keine Konflikte. In der conf_all steht auch NUR:

    Code:
    pymodbus>=3.1.3;python_version>='3.8'
    Woher rührt das also?

    #2
    Bei unterschiedlichen min (oder max) Anforderungen versucht SmartHomeNG nicht zu interpretieren, ob die Version für ein Plugin angepasst werden kann.

    Es könnte.z.B. der Fall auftreten, dass beim Plugin mit der niedrigeren min Anforderung, die max Anforderung kleiner ist als die min Anforderung des anderen Plugins. Dann würde das zusammengefasst ein min > max ergeben. Das ganze müsste ja auch über eine beliebige Anzahl inicht nur zwei) Plugins ausgewertet werden.

    Du kannst in der requirements/conf_all.txt bzw. requirements/all.txt sehen, welches Plugin welche Anforderungen stellt. In den requirments. Des jeweiligen Plugins kann das angepasst werden. Solange dass nicht durch den Plugin Autor angepasst wurde, kannst Du eine passende Version manuell installieren.
    Viele Grüße
    Martin

    There is no cloud. It's only someone else's computer.

    Kommentar


      #3
      Zitat von Msinn Beitrag anzeigen
      Es könnte.z.B. der Fall auftreten, dass beim Plugin mit der niedrigeren min Anforderung, die max Anforderung kleiner ist als die min Anforderung des anderen Plugins. Dann würde das zusammengefasst ein min > max ergeben. Das ganze müsste ja auch über eine beliebige Anzahl inicht nur zwei) Plugins ausgewertet werden.
      Wäre das dann nicht sinnvoll das auch im Log auszugeben, also auch die max-versionen gleich mit? Dann sticht das sofort ins Auge.

      Zitat von Msinn Beitrag anzeigen
      Du kannst in der requirements/conf_all.txt bzw. requirements/all.txt sehen, welches Plugin welche Anforderungen stellt. In den requirments. Des jeweiligen Plugins kann das angepasst werden. Solange dass nicht durch den Plugin Autor angepasst wurde, kannst Du eine passende Version manuell installieren.
      Danke für den Tipp. Ich habe auch gleich das pluggit-plugin angepasst und als Pull request hochgeladen. Dieses Mal hoffentlich richtig. :-)

      Sonst muss ich mal Danke sagen für die Mühe mit SmartHomeeNG. Diese ganzen requirements und ständigen Updates wo dann wieder nichts passt, machen mich ja schon irre und das ist nur ein winzig kleiner, fast unsichtbarer Teil, des gesamten. :-)

      Kommentar


        #4
        Ich habe das jetzt noch mal aus der all.txt zusammengesucht:

        Code:
        # plugin 'trovis557x'
        pymodbus>=2.2.0
        
        # plugin 'ksemmodbus'
        # plugin 'kostalmodbus'
        # plugin 'helios_tcp'
        # plugin 'modbus_tcp'
        # plugin 'sma_mb'
        pymodbus>=2.3,<3.0;python_version<'3.8'
        
        # plugin 'ksemmodbus'
        # plugin 'kostalmodbus'
        # plugin 'helios_tcp'
        # plugin 'modbus_tcp'
        # plugin 'sma_mb'
        pymodbus>=3.0.2;python_version>="3.8"
        
        # plugin 'pluggit'
        # configured plugin 'pluggit'
        pymodbus==3.3.2;python_version>='3.8'​
        Das steht jetzt im Log:

        Code:
        pymodbus: MULTIPLE requirements [{'min': '2.2.0'}, {'min': '3.0.2'}, {'min': '3.3.2', 'max': '3.3.2'}]
        Das einzige Problem, was ich jetzt sehen könnte, wäre das er die Python-Version < 3.8 nicht "sieht". Denn wenn Python min. 3.8 ist, sollten doch alle requirements passen, denn 2.2.0<=2.3<=3.0.2<=3.3.2

        Kommentar


          #5
          Du hast aus der all.txt aber nur ein configured plugin gelistet. Das sollte überhaupt keinen Konflikt geben können.

          Die all.txt ist der Gesamtüberblick über alle Plugins. Geprüft wird beim Start die conf_all.txt, die die Requirements der configurierten Komponenten enthält. Was steht denn da drin?
          Viele Grüße
          Martin

          There is no cloud. It's only someone else's computer.

          Kommentar


            #6
            Zitat von Msinn Beitrag anzeigen
            conf_all.txt
            Nur das hier:

            Code:
            # configured plugin 'pluggit'
            pymodbus==3.3.2;python_version>='3.8'​
            Möglicherweise ist der Fehler aber auch ganz woanders, denn diesen hier werde ich einfach nicht los:

            Code:
            2023-09-11  11:13:39 WARNING  lib.shpypi           - pymodbus: MULTIPLE requirements [{'min': '2.2.0'}, {'min': '3.0.2'}, {'min': '3.3.2', 'max': '3.3.2'}]
            2023-09-11  11:13:39 ERROR    cherrypy.error.1922442360 [11/Sep/2023:11:13:39] HTTP
            > Traceback (most recent call last):
            >   File "/home/smarthome/.local/lib/python3.10/site-packages/cherrypy/_cprequest.py", line 638, in respond
            >     self._do_respond(path_info)
            >   File "/home/smarthome/.local/lib/python3.10/site-packages/cherrypy/_cprequest.py", line 697, in _do_respond
            >     response.body = self.handler()
            >   File "/home/smarthome/.local/lib/python3.10/site-packages/cherrypy/lib/encoding.py", line 223, in __call__
            >     self.body = self.oldhandler(*args, **kwargs)
            >   File "/home/smarthome/.local/lib/python3.10/site-packages/cherrypy/_cpdispatch.py", line 54, in __call__
            >     return self.callable(*self.args, **self.kwargs)
            >   File "/usr/local/smarthome/modules/admin/systemdata.py", line 190, in pypi_json
            >     package_list = self.shpypi.get_packagelist()
            >   File "/usr/local/smarthome/lib/shpypi.py", line 670, in get_packagelist
            >     package['vers_req_min'] = required_packages[pkg_name].get('min', '*')
            > AttributeError: 'list' object has no attribute 'get'​
            Das ist zwar eine andere Meldung. Die kommt aber immer zeitlich mit dem requirements. Ich habe mal beides rein kopiert.

            Anmerkung: Ich nutze zwar jetzt Python 3.10, aber unter Python 3.9 hatte ich genau das gleiche Problem. Es liegt also nicht daran.

            Kommentar


              #7
              Ursache ist Deine Ungeduld 😉

              Da hast Du beim Neustart das pypi Tab in der Admin GU offen und das greift auf noch nicht initialisierte Werte zu. Ich muss das Tab mal sperren, bis die Initialisierung von SmartHomeNG abgeschlossen ist.
              Viele Grüße
              Martin

              There is no cloud. It's only someone else's computer.

              Kommentar


                #8
                Zitat von Msinn Beitrag anzeigen
                Ursache ist Deine Ungeduld 😉
                Ich verstehe den Ansatz. ;-) Ich habe da mal nachgeschaut. Die Intiatlisierung von SmartHomeNG war auf jeden Fall durch. Die Meldung kommt wohl immer dann, wenn ich das Admin-Interface öffne, auch wenn die Initalisierung durch ist. Aber das PyPI Check wird bei mir nie fertig. Da steht immer "Loading...". Wahrscheinlich deshalb, weil es den Fehler auswirft.

                Kommentar


                  #9
                  Welches zweite Plugin hast Du denn konfiguriert, welches pymodbus nutzt?
                  Viele Grüße
                  Martin

                  There is no cloud. It's only someone else's computer.

                  Kommentar


                    #10
                    Wie schon gesagt NUR ein Plugin ist konfiguriert, kein weiteres.

                    Zitat von Cannon Beitrag anzeigen
                    Nur das hier:
                    Code:

                    # configured plugin 'pluggit' pymodbus==3.3.2;python_version>='3.8'​

                    Kommentar


                      #11
                      Das lässt mich etwas ratlos zurück. Ich kann das Problem nicht nachstellen, wenn ich pluggit bei mir (ohne Devices dahinter) konfiguriere.
                      Viele Grüße
                      Martin

                      There is no cloud. It's only someone else's computer.

                      Kommentar


                        #12
                        Zitat von Msinn Beitrag anzeigen
                        Das lässt mich etwas ratlos zurück. Ich kann das Problem nicht nachstellen, wenn ich pluggit bei mir (ohne Devices dahinter) konfiguriere.
                        Das Problem hängt ermutlich irgendwie damit zusammen, dass sowohl im Admin-IF der PyPI Check nicht geht und auch diese Fehlermeldung kommt. Das kommt immer hintereinander. Ich würde daher erst mal schauen, wie ich den Fehler weg bekomme. Das scheint ja auch irgendwas mit den requirements tun haben zu müssen.

                        Aber wo man anfangen soll zu suchen, keine Ahnung.

                        Kommentar


                          #13
                          Ich habe mir das noch mal angeschaut. Ich war der Meinung zu dem Problem mit shpypi schon mal ein Thread gehabt zu haben. Ich finde den aber weder über die Suche noch über meine eigenen Beiträge. Auf jeden Fall hatte ich eine test-Version von shpypi laufen- Jetzt ist wieder das Original drin. Der Fehler bleibt gleich, aber die Zeilennummern unterscheiden sich.

                          Meine Erkenntnis ist, dass der Fehler hier auftritt:

                          Code:
                                  # process required (all) packages
                                  required_packages = self.parse_requirementsfile(os.path.join(self._sh_dir, 'requirements', 'all.txt'))
                                  self.logger.info("get_packagelist: required_packages = {}".format(required_packages))
                          
                                  for pkg_name in required_packages:
                                      if required_packages[pkg_name] != {}:   # ignore empty requirements (e.g. requirement exists only for other Python version
                                          index = self.set_packagedata(pkg_name, add=False)
                                          if index != None:
                                              package = self.package_list[index]
                          
                                              if package['is_required'] == False:
                                                  package['is_required_for_plugins'] = True
                                                  package['sort'] = self._build_sortstring(package)
                          
                                              package['vers_req_min'] = required_packages[pkg_name].get('min', '*')
                                              package['vers_req_max'] = required_packages[pkg_name].get('max', '*')
                                              package['vers_req_msg'] = ''
                                              package['vers_req_source'] = ''​
                          An der viertletzten Zeile, wo get('min', '*') drin ist. Dank das großzgigen Kommentars oben sehe ich auch, dass es sich bei der Prüfung um all.txt handelt und nicht um die conf_all.txt. Testhalber habe ich dann vor dem check mal mit:

                          Code:
                          self.logger.notice("TEST TYPE: {}".format(type(required_packages[pkg_name])))
                          den type ausgeben lassen. Irritierend, dass der Typ unterschiedlich ist. Also Dictionary und wenn der Fehler auftritt dann ist es ein List.

                          Code:
                          2023-09-12  16:13:43 NOTICE   lib.shpypi          TEST TYPE: <class 'dict'>
                          2023-09-12  16:13:43 NOTICE   lib.shpypi          TEST TYPE: <class 'dict'>
                          2023-09-12  16:13:43 NOTICE   lib.shpypi          TEST TYPE: <class 'dict'>
                          2023-09-12  16:13:43 NOTICE   lib.shpypi          TEST TYPE: <class 'dict'>
                          2023-09-12  16:13:43 NOTICE   lib.shpypi          TEST TYPE: <class 'dict'>
                          2023-09-12  16:13:43 NOTICE   lib.shpypi          TEST TYPE: <class 'dict'>
                          2023-09-12  16:13:43 NOTICE   lib.shpypi          TEST TYPE: <class 'dict'>
                          2023-09-12  16:13:43 NOTICE   lib.shpypi          TEST TYPE: <class 'dict'>
                          2023-09-12  16:13:43 NOTICE   lib.shpypi          TEST TYPE: <class 'dict'>
                          2023-09-12  16:13:43 NOTICE   lib.shpypi          TEST TYPE: <class 'dict'>
                          2023-09-12  16:13:43 NOTICE   lib.shpypi          TEST TYPE: <class 'dict'>
                          2023-09-12  16:13:43 NOTICE   lib.shpypi          TEST TYPE: <class 'dict'>
                          2023-09-12  16:13:43 NOTICE   lib.shpypi          TEST TYPE: <class 'dict'>
                          2023-09-12  16:13:43 NOTICE   lib.shpypi          TEST TYPE: <class 'dict'>
                          2023-09-12  16:13:43 NOTICE   lib.shpypi          TEST TYPE: <class 'list'>​

                          Kommentar


                            #14
                            So und jetzt mal mit Werten:

                            Code:
                            2023-09-12  16:43:34 NOTICE   lib.shpypi          TEST NAME: {'min': '1.2.2'}
                            2023-09-12  16:43:34 NOTICE   lib.shpypi          TEST TYPE: <class 'dict'>
                            2023-09-12  16:43:34 NOTICE   lib.shpypi          TEST NAME: {'min': '*', 'max': '*'}
                            2023-09-12  16:43:34 NOTICE   lib.shpypi          TEST TYPE: <class 'dict'>
                            2023-09-12  16:43:34 NOTICE   lib.shpypi          TEST NAME: {'min': '*', 'max': '*'}
                            2023-09-12  16:43:34 NOTICE   lib.shpypi          TEST TYPE: <class 'dict'>
                            2023-09-12  16:43:34 NOTICE   lib.shpypi          TEST NAME: {'min': '1.6.4'}
                            2023-09-12  16:43:34 NOTICE   lib.shpypi          TEST TYPE: <class 'list'>
                            2023-09-12  16:43:34 NOTICE   lib.shpypi          TEST NAME: [{'min': '2.2.0'}, {'min': '3.0.2'}, {'min': '3.3.2', 'max': '3.3.2'}]​
                            So wie ich das sehe, ist das möglicherweise wirklich ein Fehler. Nämlich genau dann, wenn es mehrere requirements für ein plugin gibt ist es eben kein Dictionary mehr, sondern eine Liste. Hier müsste die Liste erst einmal aufgelöst werden und geschaut werden, ob das wirklich ein Konflikt ist. In dem Beispiel gibt es hier gar keine Kollision, weil alle 3 Varianten dennoch passen ... Im Endeffekt muss exakt Version 3.3.2 installiert werden, um keinen Konflikt zu haben und alle requirements zufrieden zu stellen.

                            Sehe ich das richtig?

                            Nachtrag: In der Funktion parse_requirementsfile() wird schon auf LIST geprüft und wenn es eine Liste ist, wird der Fehler mit den MULTIPLE REQUIREMENTS ausgeworfen. Es wird dann allerdings auch nichts mehr damit gemacht und deshalb bricht dann shypi ab. Es sollten aber, wenn ich das richtig sehe die einzelnen Listenelemente ausgewertet werden und entweder dann wieder als ein Dictionary-Eintrag zusammengefügt werden, wenn es stimmig ist oder verworfen werden, wenn es nicht möglich ist das aufzulösen.
                            Zuletzt geändert von Cannon; 12.09.2023, 19:49.

                            Kommentar


                              #15
                              Zitat von Msinn Beitrag anzeigen
                              Das lässt mich etwas ratlos zurück. Ich kann das Problem nicht nachstellen, wenn ich pluggit bei mir (ohne Devices dahinter) konfiguriere.
                              Ich habs gefunden und behoben. Das habe ich erweitert:

                              Ab Zeile 925 in der shypi.py muss das hier ersetzt werden:

                              Code:
                                      if len(result_list) > 2:
                                          # Hier sollten die Einträge noch konsolidiert werden
                                          # Vorübergehend: Eine Liste von dicts zurückliefern
                                          return result_list​
                              Durch das hier:

                              Code:
                                      if len(result_list) > 2:
                                          set_min = '*'
                                          set_max = '*'
                                          for result_entry in result_list:
                                              val_min = result_entry.get('min', None)
                                              if val_min is not None and val_min != '*':
                                                  if set_min == '*' or val_min > set_min:
                                                      set_min = val_min
                                              val_max = result_entry.get('max', None)
                                              if val_max is not None and val_max != '*':
                                                  if set_max == '*' or val_max < set_max:
                                                      set_max = val_max
                                          result = {}
                                          result['min'] = set_min
                                          result['max'] = set_max
                                          return result​
                              Allerdings ist mir danach die Konsolidierung nicht ganz klar. Ich kann das nicht testen, aber meine, dass meine Funktion das mit abdecken würde. Kann da mal jemand testen bzw. Feedback zu geben. Das braucht man doch gar nicht oder?

                              Code:
                                      if len(result_list) == 2:
                                          result = {}
                              
                                          #consolidate minimum values (only '*' at the moment)
                                          val0 = result_list[0].get('min', None)
                                          val1 = result_list[1].get('min', None)
                                          if  val0 is not None and val1 is not None:
                                              # Consolidate minimum requirements
                                              if val0 == '*':
                                                  result['min'] = val1
                                              elif val1 == '*':
                                                  result['min'] = val0
                                          elif val0 is None:
                                              result['min'] = val1
                                          elif val1 is None:
                                              result['min'] = val0
                              
                                          #consolidate maximum values (only '*' at the moment)
                                          val0 = result_list[0].get('max', None)
                                          val1 = result_list[1].get('max', None)
                                          if  val0 is not None and val1 is not None:
                                              # Consolidate minimum requirements
                                              if val0 == '*':
                                                  result['max'] = val1
                                              elif val1 == '*':
                                                  result['max'] = val0
                                          elif val0 is None:
                                              result['max'] = val1
                                          elif val1 is None:
                                              result['max'] = val0
                              
                                          return result​
                              Ich müsste oben nur in if len(result_list) > 1: ändern.

                              Und was noch zu prüfen wäre, wenn min > max ist. Das wäre ein Fehler. Kann aber sein, dass das woanders schon geprüft wird.

                              Kommentar

                              Lädt...
                              X