Zitat von bmx
Beitrag anzeigen
Ankündigung
Einklappen
Keine Ankündigung bisher.
Fehler bei Requirements-check in shpypi.py: - pymodbus MULTIPLE requirements
Einklappen
X
-
Danke für den Hinweis. Da wird mir auch gleich klar, dass keiner daraus schlau wird. Denn es geht nicht um das pluggit Plugin, sondern um eine essentielle lib von SmartHomeNG shypi.py, die irgendwie nicht fertig programmiert wurde. Das zu Testen würde in jeder SmartHomeNG-Umgebung helfen. Aber ich kann, soweit ich das sehe den Namen des Themas nicht mehr ändern.
-
Ich fürchte aus dem bisherigen Posts wird niemand von sich aus drauf kommen, das Du das Pluggit Plugin meinst mit der Überschrift multiple requirements.
Daher schlage ich vor Du suchst mal im SmartHomeNG Forum nach allen Leuten die in der Vergangenheit was zum Pluggit Plugin geschrieben haben und schaust ob die noch aktiv sind. Dann kannst Du die entweder aktiv anschreiben oder hier im Forum im Post direkt erwähnen so das die das sehen können.
Einen Kommentar schreiben:
-
Bzw. noch mal als ganzes. Kann jemand mal die Funktion _split_requirement ersetzen und Feedback geben? Bei mir läuft jetzt alles fehlerfrei und ist sogar noch weniger Code:
Code:def _split_requirement(self, req_str, do_log=False): """ Split requirement string :param req_str: :return: """ pyversion = "{0}.{1}".format(sys.version_info[0], sys.version_info[1]) # Split requirement string into list of requirements (with python version) requirements_list = req_str.split('|') result_list = [] for i in range(0, len(requirements_list)): # Split requirement (with python version) into list of requirement and python version requirement = requirements_list[i].split(';') # split requirement into list of requirement and pyvers requirement if do_log: self.logger.debug("- _split_requirement *1: {} -> requirement = {}".format(requirements_list[i], requirement)) if len(requirement) == 1: result_list.append(self._split_requirement_to_min_max(requirement[0])) else: # python version sppecified in requirement for j in range(0, len(requirement)): requirement[j] = requirement[j].strip() if do_log: self.logger.info("- _split_requirement *2: {} -> requirement = {}".format(requirements_list[i], requirement)) if requirement[1].startswith('python_version'): requirement[1] = requirement[1].replace('python_version', '') operator, version = self._split_operator(requirement[1]) if self._compare_versions(pyversion, version, operator): result_list.append(self._split_requirement_to_min_max(requirement[0])) if len(result_list) > 1: 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 if len(result_list) == 0: return {} return result_list[0]
Einen Kommentar schreiben:
-
Ich habs gefunden und behoben. Das habe ich erweitert:Zitat von Msinn Beitrag anzeigenDas lässt mich etwas ratlos zurück. Ich kann das Problem nicht nachstellen, wenn ich pluggit bei mir (ohne Devices dahinter) konfiguriere.
Ab Zeile 925 in der shypi.py muss das hier ersetzt werden:
Durch das hier: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
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: 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
Ich müsste oben nur in if len(result_list) > 1: ändern.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
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.
Einen Kommentar schreiben:
-
So und jetzt mal mit Werten:
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.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'}]
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.
Einen Kommentar schreiben:
-
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:
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:# 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'] = ''
den type ausgeben lassen. Irritierend, dass der Typ unterschiedlich ist. Also Dictionary und wenn der Fehler auftritt dann ist es ein List.Code:self.logger.notice("TEST TYPE: {}".format(type(required_packages[pkg_name])))
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'>
Einen Kommentar schreiben:
-
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.Zitat von Msinn Beitrag anzeigenDas lässt mich etwas ratlos zurück. Ich kann das Problem nicht nachstellen, wenn ich pluggit bei mir (ohne Devices dahinter) konfiguriere.
Aber wo man anfangen soll zu suchen, keine Ahnung.
Einen Kommentar schreiben:
-
Das lässt mich etwas ratlos zurück. Ich kann das Problem nicht nachstellen, wenn ich pluggit bei mir (ohne Devices dahinter) konfiguriere.
Einen Kommentar schreiben:
-
Wie schon gesagt NUR ein Plugin ist konfiguriert, kein weiteres.
Zitat von Cannon Beitrag anzeigenNur das hier:
Code:
# configured plugin 'pluggit' pymodbus==3.3.2;python_version>='3.8'
Einen Kommentar schreiben:
-
Welches zweite Plugin hast Du denn konfiguriert, welches pymodbus nutzt?
Einen Kommentar schreiben:
-
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.Zitat von Msinn Beitrag anzeigenUrsache ist Deine Ungeduld 😉
Einen Kommentar schreiben:
-
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.
Einen Kommentar schreiben:
-
Nur das hier:Zitat von Msinn Beitrag anzeigenconf_all.txt
Möglicherweise ist der Fehler aber auch ganz woanders, denn diesen hier werde ich einfach nicht los:Code:# configured plugin 'pluggit' pymodbus==3.3.2;python_version>='3.8'
Das ist zwar eine andere Meldung. Die kommt aber immer zeitlich mit dem requirements. Ich habe mal beides rein kopiert.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'
Anmerkung: Ich nutze zwar jetzt Python 3.10, aber unter Python 3.9 hatte ich genau das gleiche Problem. Es liegt also nicht daran.
Einen Kommentar schreiben:
-
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?
Einen Kommentar schreiben:
-
Ich habe das jetzt noch mal aus der all.txt zusammengesucht:
Das steht jetzt im Log: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 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.2Code:pymodbus: MULTIPLE requirements [{'min': '2.2.0'}, {'min': '3.0.2'}, {'min': '3.3.2', 'max': '3.3.2'}]
Einen Kommentar schreiben:


Einen Kommentar schreiben: