excalibur icon indicating copy to clipboard operation
excalibur copied to clipboard

fails to start on python 3.10.1

Open muralikodali opened this issue 3 years ago • 17 comments

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)

muralikodali avatar Dec 19 '21 11:12 muralikodali

Hello, i've the same problem

Philippe-M avatar Dec 23 '21 16:12 Philippe-M

You have an outdated version of configparser using a deprecated call that has been removed in python 3.10. Using pip for example you can update with:

pip install configparser -U

As a rule of thumb, try to keep you packages updated to prevent this kind of issues.

Andrflor avatar Mar 01 '22 09:03 Andrflor

pip install configparser -u giving the following output :

Defaulting to user installation because normal site-packages is not writeable
Requirement already satisfied: configparser in /home/murali/.local/lib/python3.10/site-packages (5.2.0)

Above error ImportError: cannot import name 'MutableMapping' from 'collections' (/usr/lib/python3.10/collections/__init__.py) is shown again.

muralikodali avatar Mar 01 '22 12:03 muralikodali

You have two install of configparser.

Look the path

Defaulting to user installation because normal site-packages is not writeable
Requirement already satisfied: configparser in /home/murali/.local/lib/python3.10/site-packages (5.2.0)

Above error ImportError: cannot import name 'MutableMapping' from 'collections' (/usr/lib/python3.10/collections/__init__.py) is shown again.

One is : /usr/lib/python3.10/ And the other is : /home/murali/.local/lib/python3.10/

You can check the versions of the packages installed with: pip freeze for root packages and pip freeze --user for your user.

I guess that pip freeze --user will give you the latest 5.2.0 And the pip freeze has an outdated version.

(If you are not familiar with bash you can use grep to locate a package for example you can do) pip freeze | grep configparser

I think you may need to update the root package and not the local one to make it work. sudo pip install configparser -U

If it does not work, i'm curious to see full outputs of both of your pip freeze...

Andrflor avatar Mar 01 '22 18:03 Andrflor

i have installed configparser-5.2.0 with pip install --upgrade configparser, but excalibur is showing lower version requirement for configparser.

Successfully uninstalled configparser-3.5.3
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 5.2.0 which is incompatible.
Successfully installed configparser-5.2.0

muralikodali avatar Mar 02 '22 09:03 muralikodali

My current config on python 3.10 root packages

excalibur-py==0.4.3
  - camelot-py [required: >=0.7.1, installed: 0.9.0]
...
  - configparser [required: >=3.5.0,<3.6.0, installed: 5.2.0]
...

As you can see i have configparser 5.2.0 even if the requirement says >=3.5.0,<3.6.0 and it's working like a charm... Is it working for you?

Still, a configparser requirement version update is needed...

Andrflor avatar Mar 02 '22 11:03 Andrflor

Updating cofigparser unravels another dependency issue with itsdangerous; which in turn needs to be downgraded to 2.0.1.

Traceback (most recent call last):
  File "/home/mikolaj/Desktop/tables/excalibur/bin/excalibur", line 5, in <module>
    from excalibur.cli import cli
  File "/home/mikolaj/Desktop/tables/excalibur/lib/python3.10/site-packages/excalibur/cli.py", line 12, in <module>
    from .www.app import create_app
  File "/home/mikolaj/Desktop/tables/excalibur/lib/python3.10/site-packages/excalibur/www/app.py", line 3, in <module>
    from flask import Flask, Blueprint
  File "/home/mikolaj/Desktop/tables/excalibur/lib/python3.10/site-packages/flask/__init__.py", line 19, in <module>
    from . import json
  File "/home/mikolaj/Desktop/tables/excalibur/lib/python3.10/site-packages/flask/json/__init__.py", line 15, in <module>
    from itsdangerous import json as _json
ImportError: cannot import name 'json' from 'itsdangerous' (/home/mikolaj/Desktop/tables/excalibur/lib/python3.10/site-packages/itsdangerous/__init__.py)

MKuranowski avatar Mar 17 '22 17:03 MKuranowski

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]

kuirolo avatar Apr 12 '22 03:04 kuirolo

@kuirolo I'm stuck at the same step than you => did you find a work around?

echidne avatar Jun 27 '22 11:06 echidne

Did this ever get fixed? Having the same issue

EDIT: @kuirolo was correct in his next steps. I fixed it by changing view.py on the line importing secure_filename from workzeug (which should be from workzeug.utils)

sh4yce avatar Jul 26 '22 04:07 sh4yce

+1 having the same issue

dmil avatar Oct 12 '22 22:10 dmil

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)

oleole39 avatar Jan 01 '23 22:01 oleole39

@oleole39 Thanks! That worked well for me!

kilojulius avatar Jun 08 '23 18:06 kilojulius

Wonderful, thanks @oleole39 for the solution :)

A small addition for those who happen to work in an anaconda environment, the file location of step 3 is then:

C:\Users\{USERNAME}\AppData\Local\anaconda3\Lib\site-packages\excalibur\www\views.py

floriandierickx avatar Aug 08 '23 15:08 floriandierickx

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

scaggio avatar Nov 02 '23 09:11 scaggio

@scaggio

but i couldn't solve the issue. It raises me this error:

Not sure about the issue, but I guess a good start would be to solve the issue that seems to be caused by the dependencies' versions. To give you an indication, I run excalibur sucessfully with Python 3.10.12 and:

camelot-py==0.9.0
click==8.1.3
celery==5.2.7
configparser==5.3.0
Flask==1.1.2
SQLAlchemy==1.4.42
Werkzeug==1.0.1

(you can downgrade packages by specifying exact version you want to install pip install configparser==5.3.0. But if you are using the packages for other uses, you might experience issues with them. To avoid that install excalibur using a python virtual environement)

oleole39 avatar Nov 06 '23 14:11 oleole39

hi

another dockerized and fixed version here https://github.com/camelot-dev/excalibur/pull/183

it not perfect but at least can use the app

sd3ntato avatar May 14 '24 12:05 sd3ntato