Syntax-Wechsel zwischen Python 3.9.10 und 3.10.7 / module 'collections' has no attribute 'Callable'?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
nbehrnd
User
Beiträge: 5
Registriert: Mittwoch 5. Oktober 2022, 17:39

Ähnlich wie bereits unter Linux Debian 12/bookworm möchte ich Karl Voit's Anwendung filetags (https://github.com/novoid/filetags) auch unter Windows anwenden. In Linux ist die Installation und Anwendung als eine benutzerdefinierte Aktion im Dateimanager Thunar (4.16.10, Xfce4 DE) Python 3.10.7 problemlos. Ebenso -- bisher -- in Windows 10, 32 bit, mit Python 3.9.10 (https://github.com/novoid/filetags/issues/49).

Obwohl während der Installation in Windows 10, 32 bit mit gegenwärtigem Python 3.10.7, oder python-3.11.0rc2 keine Fehlermeldung auftaucht, ist der gleiche Quellcode nicht (mehr) ausführbar. Wenn etwa die `__init.py__` Datei als `filetags.py` auf dem Desktop abgelegt wird, und über die Kommandozeile

Code: Alles auswählen

python filetags --help
aufgerufen wird, beschreibt cmd.exe zahlreiche Probleme (siehe unten). Meine Frage ist deshalb, ob es vielleicht seit Veröffentlichung von Python 3.9.10 für Windows einen (gegenüber dem Einsatz unter Linux) veränderten Syntax gibt, der im Quellcode zu berücksichtigen wäre, um die Anwendung wieder zum laufen zu bringen. (`$username` ist hier nur ein Platzhalter für das Nutzerkonto.)

Code: Alles auswählen

C:\Users\$username\Desktop>python filetags.py --help
Traceback (most recent call last):
  File "C:\Users\$username\Desktop\filetags.py", line 51, in <module>
    save_import('readline')   # for raw_input() reading from stdin
    ^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\$username\Desktop\filetags.py", line 35, in save_import
    globals()[library] = import_module(library)
                         ^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\$username\AppData\Local\Programs\Python\Python311-32\Lib\importlib\__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "<frozen importlib._bootstrap>", line 1206, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1178, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1149, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 690, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 940, in exec_module
  File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
  File "C:\Users\$username\AppData\Local\Programs\Python\Python311-32\Lib\site-packages\readline.py", line 34, in <module>
    rl = Readline()
         ^^^^^^^^^^
  File "C:\Users\$username\AppData\Local\Programs\Python\Python311-32\Lib\site-packages\pyreadline\rlmain.py", line 422, in __init__
    BaseReadline.__init__(self)
  File "C:\Users\$username\AppData\Local\Programs\Python\Python311-32\Lib\site-packages\pyreadline\rlmain.py", line 62, in __init__
    mode.init_editing_mode(None)
  File "C:\Users\$username\AppData\Local\Programs\Python\Python311-32\Lib\site-packages\pyreadline\modes\emacs.py", line 633, in init_editing_mode
    self._bind_key('space',       self.self_insert)
  File "C:\Users\$username\AppData\Local\Programs\Python\Python311-32\Lib\site-packages\pyreadline\modes\basemode.py", line 162, in _bind_key
    if not callable(func):
           ^^^^^^^^^^^^^^
  File "C:\Users\$username\AppData\Local\Programs\Python\Python311-32\Lib\site-packages\pyreadline\py3k_compat.py", line 8, in callable
    return isinstance(x, collections.Callable)
                         ^^^^^^^^^^^^^^^^^^^^
AttributeError: module 'collections' has no attribute 'Callable'

C:\Users\$username\Desktop>

Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Du brauchst collections.abc.Callable. Aber eigentlich hätte das unter Python 3.9 problemlos laufen sollen.
nbehrnd
User
Beiträge: 5
Registriert: Mittwoch 5. Oktober 2022, 17:39

Falls es sich um das selbe Problem handelt, wie in der Antwort bei stackoverflow (https://stackoverflow.com/questions/658 ... thon-3-9-1), das also bereits seit repariert sein sollte / bereits wieder funktionierte (https://bugs.python.org/issue43004), wäre die jetzige Beobachtung ein bug den ich an anderer Stelle für die Entwickler sichtbarer beschreiben sollte? Gegenwärtig hat es 158 offene Einträge im bugtracker https://github.com/python/cpython/issue ... ollections auf GitHub bei einer Suche mit dem (nicht sehr einschränkenden) Schlüsselwort «collections».

Bisher verstehe ich die Dokumentation (https://docs.python.org/3/library/collections.abc.html) so, dass das module wie etwa os und shutil Bestandteil der Standardbibliothek ist. Deshalb bin ich unsicher, ob mit https://pypi.org/project/py3collections/ (oder einem anderen Modul auf pypi.org) eine Nachinstallation / Reparatur mit einer besseren Version möglich/ratsam wäre. Als wäre das noch nicht bereits genug, berichtet cmd.exe bereits beim Start von Python Schwierigkeiten (nicht so die IDLE Shell) während einfache Schleifen sich durchaus «normal» verhalten:

Code: Alles auswählen

C:\Users\$username>python
Python 3.11.0rc2 (main, Sep 11 2022, 20:09:53) [MSC v.1933 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
Failed calling sys.__interactivehook__
Traceback (most recent call last):
  File "<frozen site>", line 445, in register_readline
  File "C:\Users\$username\AppData\Local\Programs\Python\Python311-32\Lib\site-packages\readline.py", line 34, in <module>
    rl = Readline()
         ^^^^^^^^^^
  File "C:\Users\$username\AppData\Local\Programs\Python\Python311-32\Lib\site-packages\pyreadline\rlmain.py", line 422, in __init__
    BaseReadline.__init__(self)
  File "C:\Users\$username\AppData\Local\Programs\Python\Python311-32\Lib\site-packages\pyreadline\rlmain.py", line 62, in __init__
    mode.init_editing_mode(None)
  File "C:\Users\$username\AppData\Local\Programs\Python\Python311-32\Lib\site-packages\pyreadline\modes\emacs.py", line 633, in init_editing_mode
    self._bind_key('space',       self.self_insert)
  File "C:\Users\$username\AppData\Local\Programs\Python\Python311-32\Lib\site-packages\pyreadline\modes\basemode.py", line 162, in _bind_key
    if not callable(func):
           ^^^^^^^^^^^^^^
  File "C:\Users\$username\AppData\Local\Programs\Python\Python311-32\Lib\site-packages\pyreadline\py3k_compat.py", line 8, in callable
    return isinstance(x, collections.Callable)
                         ^^^^^^^^^^^^^^^^^^^^
AttributeError: module 'collections' has no attribute 'Callable'
>>>
>>> for i in range(4):
...      print(i)
...
0
1
2
3
>>>
Benutzeravatar
sparrow
User
Beiträge: 4186
Registriert: Freitag 17. April 2009, 10:28

Ich verstehe deine grundlegende Fehlerbeschreibung nicht.
Könntest du bitte Schritt für Schrit darlegen, was du tust, bis der Fehler auftritt? Das ist mir sonst alles zu konfus.
Benutzeravatar
sparrow
User
Beiträge: 4186
Registriert: Freitag 17. April 2009, 10:28

Die Antwort ist übrigens recht simpel: "filetags" verwendet in seinen requirements "pyreadline". Das ist das Modul, das den Fehler verursacht. "pyreadline" hat sein letztes Update vor 7 Jahren. Das ist schlicht tot.

Verwendet man stattdessen "pyreadline3" funktioniert es problemlos.
nbehrnd
User
Beiträge: 5
Registriert: Mittwoch 5. Oktober 2022, 17:39

Der bisher letzte Versuch ging von Windows 10/32 bit und 3.11.0rc2 aus.

Wie in der Anleitung auf GitHub beschrieben, wurde zuerst Python mit `pip install pypiwin32` ergänzt. Anschliessend third party module `filetags` in der Version 2022.9.16.1 ([2022-09-16 Fri]) mit `pip install filetags integratethis` installiert. Um im Dateimanager unter `SendTo` eine Verknüpfung, die eine neue (temporäre) Eingabemaske startet, anzubieten, wurde auf cmd.exe auch noch `integratethis filetags` ausgeführt. Bis hierher traten keine Probleme auf.

Aber sodann 1): Rechtsklick auf eine beliebige Datei, `SendTo` -> filetags startet die Eingabemaske die aber so rasch wieder vom System geschlossen wird, dass es mir nicht möglich war, für diese Datei einen tag zu definieren.

Deshalb 2) meine Absicht, `__init.py__` aus dem GitHub repository unter dem Namen `filetags.py` auf den Desktop zu kopieren, mit cmd.exe mit `cd` auf den Desktop zu wechseln um mit `python filetags.py --help` zumindest das mit argparse in dieser Datei definierte Menü aufzurufen. Da ich keine weiteren .py Dateien im GitHub repository vorfand und ein analoger Aufruf dieser einen Datei in Linux Debian funktioniert, war meine Annahme, das sollte hier in Windows (wieder) ebenso funktionieren. Aber auch dieser Versuch schlug fehl, d.h. nicht einmal das argparse-Menü war zu erreichen.

Somit der Entschluss, in diesem Forum nach Hilfe zu suchen. Dankenswerterweise Deinen Hinweis, `pyreadline` mit `pyreadline3` zu substituieren, erhalten; mit angepasster `requirements.txt` sowie `pip install -r requirements.txt` die Anwendung bereits in Windows (wieder) funktionstüchtig. Merci für die Hilfe!

Ebenso ist bei Karl Voit mit Referenz zu diesem Austausch ein PR eingereicht worden (https://github.com/novoid/filetags/pull/50); die Absicht ist, noch innert dieser Woche sowohl das GitHub repository, als auch den Eintrag bei pypi.org entsprechend zu aktualisieren. Damit wäre das Problem gelöst.
Antworten