excalibur: fails to start on python 3.10.1

excalibur fails to load with python version 3.10.1 giving the below error :

Traceback (most recent call last):
  File "/home/murali/.local/bin/excalibur", line 5, in <module>
    from excalibur.cli import cli
  File "/home/murali/.local/lib/python3.10/site-packages/excalibur/cli.py", line 7, in <module>
    from . import __version__, settings
  File "/home/murali/.local/lib/python3.10/site-packages/excalibur/settings.py", line 10, in <module>
    from . import configuration as conf
  File "/home/murali/.local/lib/python3.10/site-packages/excalibur/configuration.py", line 7, in <module>
    from backports.configparser import ConfigParser
  File "/home/murali/.local/lib/python3.10/site-packages/backports/configparser/__init__.py", line 130, in <module>
    from collections import MutableMapping
ImportError: cannot import name 'MutableMapping' from 'collections' (/usr/lib/python3.10/collections/__init__.py)

About this issue

  • Original URL
  • State: open
  • Created 3 years ago
  • Reactions: 7
  • Comments: 16

Most upvoted comments

Same issue here as the one pictured and solved by kuirolo hereinabove although there seems to be a typo in what @kuirolo & @sh4yce mention at the final step of the fix (it is werkzeug and not workzeug).

To sum up, I was able to run excalibur initdb and excalibur webserver successfully after doing the following:

  1. pip install -U configparser
  2. pip install -U flask
  3. Replace line 10 of {ROOT_TO_PYTHON_FOLDER}/python3.10/site-packages/excalibur/www/views.py with from werkzeug.utils import secure_filename (i.e. overwriting previous line containing from werkzeug import secure_filename)

Apologies if this is a lot of terminal dumps and not a lot of pull requests. I’m fairly new to contributing.

This seems partly related to issue #152 which I had on python 3.8 with similar ImportErrors.

On python 3.10, starting from a fresh venv I had the following chain of ImportErrors while trying to run excalibur initdb, the first few were resolved by updated the importing package as @Andrflor suggested.

TL;DR: this issue might be resolved by moving up some of the version requirements in setup.py, and changing an import call in excalibur.www.views

Here’s what happend for me:

(venv) $ pip install excalibur
(venv) $ excalibur initdb
...
  File "/home/kuirolo/.venv/excal310/lib64/python3.10/site-packages/excalibur/configuration.py", line 7, in <module>
    from backports.configparser import ConfigParser
  File "/home/kuirolo/.venv/excal310/lib64/python3.10/site-packages/backports/configparser/__init__.py", line 130, in <module>
    from collections import MutableMapping
ImportError: cannot import name 'MutableMapping' from 'collections' (/usr/lib64/python3.10/collections/__init__.py)
(venv) $ pip install -U configparser # Move from 3.5.2 to 5.2.0

With option captial -U this resolved @muralikodali 's issue for me.

(venv) $ excalibur initdb
...
  File "/home/kuirolo/.venv/excal310/lib64/python3.10/site-packages/excalibur/www/app.py", line 3, in <module>
    from flask import Flask, Blueprint
  File "/home/kuirolo/.venv/excal310/lib64/python3.10/site-packages/flask/__init__.py", line 14, in <module>
   from jinja2 import escape
ImportError: cannot import name 'escape' from 'jinja2' (/home/kuirolo/.venv/excal310/lib64/python3.10/site-packages/jinja2/__init__.py)
(venv) $ pip install -U flask # Move from flask 1.1.2 to 2.1.1 and from werkzeug 0.16.1 to 2.1.1

This is an upstream issue with flask 1.1.0, so it is resolved by upgrading. I also had this issue on python 3.8 after resolving issue #152 .

(venv) $ excalibur initdb
...
  File "/home/kuirolo/.venv/excal310/lib64/python3.10/site-packages/excalibur/www/app.py", line 7, in <module>
    from .views import views
  File "/home/kuirolo/.venv/excal310/lib64/python3.10/site-packages/excalibur/www/views.py", line 10, in <module>
    from werkzeug import secure_filename
ImportError: cannot import name 'secure_filename' from 'werkzeug' (/home/kuirolo/.venv/excal310/lib64/python3.10/site-packages/werkzeug/__init__.py)

Here I think the solution is changing the excalibur.www.views import call to reflect the refactoring of workzeug in 2.1.1. According to this stackoverflow secure_filename now has to be imported using from workzeug.utils import secure_filename.

I’ll take a crack at fixing this tomorrow if I have time.

[Edited for clarity and terminal formatting]

Same error of @muralikodali (ImportError: cannot import name ‘MutableMapping’ from ‘collections’). I tried to follow your suggestions (@oleole39 ) but i couldn’t solve the issue. It raises me this error:

Traceback (most recent call last):
  File "<frozen runpy>", line 198, in _run_module_as_main
  File "<frozen runpy>", line 88, in _run_code
  File "C:\Users\giosc\anaconda3\envs\data_analysis\Scripts\excalibur.exe\__main__.py", line 4, in <module>
  File "C:\Users\giosc\anaconda3\envs\data_analysis\Lib\site-packages\excalibur\cli.py", line 10, in <module>
    from .tasks import split, extract
  File "C:\Users\giosc\anaconda3\envs\data_analysis\Lib\site-packages\excalibur\tasks.py", line 13, in <module>
    from camelot.ext.ghostscript import Ghostscript
ModuleNotFoundError: No module named 'camelot.ext'

but the way i have: camelot-py==0.11.0

While upgrading configparser and flask it raised me this: ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts. excalibur-py 0.4.3 requires configparser<3.6.0,>=3.5.0, but you have configparser 6.0.0 which is incompatible. excalibur-py 0.4.3 requires Werkzeug<1.0.0, but you have werkzeug 3.0.1 which is incompatible

I have python 3.11.5