Flask-AppBuilder icon indicating copy to clipboard operation
Flask-AppBuilder copied to clipboard

ModuleNotFoundError in `flask fab create-app` with python 3.12

Open ZeeD opened this issue 2 years ago • 3 comments

According to pep 632 python 3.12 doesn't ship distutils anymore. But distutils is still used in flask fab create-app.

Environment

python: 3.12 Flask-Appbuilder version: 4.3.7

Describe the expected results

flask fab create-app works as described in the documentation

Describe the actual results

flask fab create-app yields an error:

Traceback (most recent call last):
  File "/Users/a206719281/eclipse-workspace/ocellus-ui-backend-src/.venv/bin/flask", line 8, in <module>
    sys.exit(main())
             ^^^^^^
  File "/Users/a206719281/eclipse-workspace/ocellus-ui-backend-src/.venv/lib/python3.12/site-packages/flask/cli.py", line 1064, in main
    cli.main()
  File "/Users/a206719281/eclipse-workspace/ocellus-ui-backend-src/.venv/lib/python3.12/site-packages/click/core.py", line 1078, in main
    rv = self.invoke(ctx)
         ^^^^^^^^^^^^^^^^
  File "/Users/a206719281/eclipse-workspace/ocellus-ui-backend-src/.venv/lib/python3.12/site-packages/click/core.py", line 1682, in invoke
    cmd_name, cmd, args = self.resolve_command(ctx, args)
                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/a206719281/eclipse-workspace/ocellus-ui-backend-src/.venv/lib/python3.12/site-packages/click/core.py", line 1729, in resolve_command
    cmd = self.get_command(ctx, cmd_name)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/a206719281/eclipse-workspace/ocellus-ui-backend-src/.venv/lib/python3.12/site-packages/flask/cli.py", line 566, in get_command
    self._load_plugin_commands()
  File "/Users/a206719281/eclipse-workspace/ocellus-ui-backend-src/.venv/lib/python3.12/site-packages/flask/cli.py", line 561, in _load_plugin_commands
    self.add_command(ep.load(), ep.name)
                     ^^^^^^^^^
  File "/usr/local/Cellar/[email protected]/3.12.0/Frameworks/Python.framework/Versions/3.12/lib/python3.12/importlib/metadata/__init__.py", line 205, in load
    module = import_module(match.group('module'))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/Cellar/[email protected]/3.12.0/Frameworks/Python.framework/Versions/3.12/lib/python3.12/importlib/__init__.py", line 90, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "<frozen importlib._bootstrap>", line 1381, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1354, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1304, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 488, in _call_with_frames_removed
  File "<frozen importlib._bootstrap>", line 1381, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1354, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1325, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 929, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 994, in exec_module
  File "<frozen importlib._bootstrap>", line 488, in _call_with_frames_removed
  File "/Users/a206719281/eclipse-workspace/ocellus-ui-backend-src/.venv/lib/python3.12/site-packages/flask_appbuilder/__init__.py", line 5, in <module>
    from .api import ModelRestApi  # noqa: F401
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/a206719281/eclipse-workspace/ocellus-ui-backend-src/.venv/lib/python3.12/site-packages/flask_appbuilder/api/__init__.py", line 29, in <module>
    from marshmallow_sqlalchemy.fields import Related, RelatedList
  File "/Users/a206719281/eclipse-workspace/ocellus-ui-backend-src/.venv/lib/python3.12/site-packages/marshmallow_sqlalchemy/__init__.py", line 1, in <module>
    from .schema import (
  File "/Users/a206719281/eclipse-workspace/ocellus-ui-backend-src/.venv/lib/python3.12/site-packages/marshmallow_sqlalchemy/schema.py", line 6, in <module>
    from .convert import ModelConverter
  File "/Users/a206719281/eclipse-workspace/ocellus-ui-backend-src/.venv/lib/python3.12/site-packages/marshmallow_sqlalchemy/convert.py", line 4, in <module>
    from distutils.version import LooseVersion
ModuleNotFoundError: No module named 'distutils'

Steps to reproduce

$ python3.12 -m venv .venv
$ . .venv/bin/activate
(.venv) $ python -mpip install flask-appbuilder
(.venv) $ flask fab create-app

ZeeD avatar Oct 12 '23 09:10 ZeeD

Good to know, some work as to be done to add 3.10, 3.11 and 3.12 to CI and remove distutils.

dpgaspar avatar Oct 12 '23 10:10 dpgaspar

FWIW as a workaround I've just added setuptools as a dependency in my project

ZeeD avatar Oct 12 '23 10:10 ZeeD

Looks like this change: https://github.com/marshmallow-code/marshmallow-sqlalchemy/pull/435/files removed distutils dependency

dpgaspar avatar Oct 13 '23 10:10 dpgaspar