본문 바로가기

프로그래밍/Python

Flask ImportError: cannot import name 'soft_unicode' from 'markupsafe'

반응형

visual studio 2019 로 기본 flask 프로젝트를 생성했다.

가상환경을 python 3.9 기반으로 만들고 (비주얼 스튜디오는 자동으로 flask 패키지까지 생성한 가상환경에 깔아준다.) 녹색 플레이버튼을 눌러서 실행해 보려 했다.

비주얼 스튜디오는 아주 간단한 플라스크웹앱을 기본으로 만들기 때문에, 실행하면 기본 브라우저가 실행되면서, 프로젝트가 만드는 웹사이트의 홈화면이 나와야 한다.

하지만, 에러가 발생하면서, 이 과정이 실패했다.

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\me\source\repos\FlaskWebProject1\env\lib\site-packages\flask\__init__.py", line 14, in <module>
    from jinja2 import escape
  File "C:\Users\me\source\repos\FlaskWebProject1\env\lib\site-packages\jinja2\__init__.py", line 12, in <module>
    from .environment import Environment
  File "C:\Users\me\source\repos\FlaskWebProject1\env\lib\site-packages\jinja2\environment.py", line 25, in <module>
    from .defaults import BLOCK_END_STRING
  File "C:\Users\me\source\repos\FlaskWebProject1\env\lib\site-packages\jinja2\defaults.py", line 3, in <module>
    from .filters import FILTERS as DEFAULT_FILTERS  # noqa: F401
  File "C:\Users\me\source\repos\FlaskWebProject1\env\lib\site-packages\jinja2\filters.py", line 13, in <module>
    from markupsafe import soft_unicode
ImportError: cannot import name 'soft_unicode' from 'markupsafe' 
(C:\Users\me\source\repos\FlaskWebProject1\env\lib\site-packages\markupsafe\__init__.py)

비주얼 스튜디오가 템플릿으로 생성한 프로젝트 코드에는 문제일 가능성은 낮고, 패키지들 중에 무언가가 문제일 가능성이 높다.

현재 패키지들은 requirements.txt 안의 Flask~=1.1 패키지 제약에 의해서 flask 와 flask 의 종속 패키지들이 깔려 있는 상태다. pip list 로 패키지 버전들을 보면,

Package            Version
------------------ -------
click              7.1.2
colorama           0.4.5
Flask              1.1.4
importlib-metadata 4.12.0
itsdangerous       1.1.0
Jinja2             2.11.3
MarkupSafe         2.1.1
pip                22.1.2
setuptools         57.4.0
Werkzeug           1.0.1
zipp               3.8.1

에러메시지를 살펴보면, jinja2 패키지에서 에러가 발생했고, markupsafe 패키지의 soft_unicode 라는 이름을 가져오는 데 실패한 것이다. jinja2 패키지 부터 업데이트 해 보자.

> pip install -U jinja2 markupsafe
Requirement already satisfied: jinja2 in c:\users\me\source\repos\flaskwebproject1\env\lib\site-packages (2.11.3)
Collecting jinja2
  Using cached Jinja2-3.1.2-py3-none-any.whl (133 kB)
Requirement already satisfied: markupsafe in c:\users\me\source\repos\flaskwebproject1\env\lib\site-packages (2.1.1)
Installing collected packages: jinja2
  Attempting uninstall: jinja2
    Found existing installation: Jinja2 2.11.3
    Uninstalling Jinja2-2.11.3:
      Successfully uninstalled Jinja2-2.11.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.
flask 1.1.4 requires Jinja2<3.0,>=2.10.1, but you have jinja2 3.1.2 which is incompatible.
Successfully installed jinja2-3.1.2

flask 의 요구와 맞지 않는다고 뜨는데, 일단 무시하고 테스트 해 보자.

Python 3.9.7 (tags/v3.9.7:1016ef3, Aug 30 2021, 20:19:38) [MSC v.1929 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import flask
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\me\source\repos\FlaskWebProject1\env\lib\site-packages\flask\__init__.py", line 14, in <module>
    from jinja2 import escape
ImportError: cannot import name 'escape' from 'jinja2' (C:\Users\me\source\repos\FlaskWebProject1\env\lib\site-packages\jinja2\__init__.py)

flask 가 jinja2 를 부르는 곳에서 에러가 발생했다. 위의 에러메시지를 무시해선 안 됐었나보다.

flask 를 업데이트 해 본다.

1> pip install -U flask
Requirement already satisfied: flask in c:\users\me\source\repos\flaskwebproject1\env\lib\site-packages (1.1.4)
Collecting flask
  Using cached Flask-2.1.3-py3-none-any.whl (95 kB)
Collecting Werkzeug>=2.0
  Using cached Werkzeug-2.1.2-py3-none-any.whl (224 kB)
Collecting click>=8.0
  Using cached click-8.1.3-py3-none-any.whl (96 kB)
Collecting itsdangerous>=2.0
  Using cached itsdangerous-2.1.2-py3-none-any.whl (15 kB)
Requirement already satisfied: Jinja2>=3.0 in c:\users\me\source\repos\flaskwebproject1\env\lib\site-packages (from flask) (3.1.2)
Requirement already satisfied: importlib-metadata>=3.6.0 in c:\users\me\source\repos\flaskwebproject1\env\lib\site-packages (from flask) (4.12.0)
Requirement already satisfied: colorama in c:\users\me\source\repos\flaskwebproject1\env\lib\site-packages (from click>=8.0->flask) (0.4.5)
Requirement already satisfied: zipp>=0.5 in c:\users\me\source\repos\flaskwebproject1\env\lib\site-packages (from importlib-metadata>=3.6.0->flask) (3.8.1)
Requirement already satisfied: MarkupSafe>=2.0 in c:\users\me\source\repos\flaskwebproject1\env\lib\site-packages (from Jinja2>=3.0->flask) (2.1.1)
Installing collected packages: Werkzeug, itsdangerous, click, flask
  Attempting uninstall: Werkzeug
    Found existing installation: Werkzeug 1.0.1
    Uninstalling Werkzeug-1.0.1:
      Successfully uninstalled Werkzeug-1.0.1
  Attempting uninstall: itsdangerous
    Found existing installation: itsdangerous 1.1.0
    Uninstalling itsdangerous-1.1.0:
      Successfully uninstalled itsdangerous-1.1.0
  Attempting uninstall: click
    Found existing installation: click 7.1.2
    Uninstalling click-7.1.2:
      Successfully uninstalled click-7.1.2
  Attempting uninstall: flask
    Found existing installation: Flask 1.1.4
    Uninstalling Flask-1.1.4:
      Successfully uninstalled Flask-1.1.4
Successfully installed Werkzeug-2.1.2 click-8.1.3 flask-2.1.3 itsdangerous-2.1.2

import flask 가 에러없이 성공하는지 확인

> python
Python 3.9.7 (tags/v3.9.7:1016ef3, Aug 30 2021, 20:19:38) [MSC v.1929 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import flask
>>>

에러없이 성공했다. 이 때의 패키지들 버전은 다음과 같다.

> pip list
Package            Version
------------------ -------
click              8.1.3
colorama           0.4.5
Flask              2.1.3
importlib-metadata 4.12.0
itsdangerous       2.1.2
Jinja2             3.1.2
MarkupSafe         2.1.1
pip                22.1.2
setuptools         57.4.0
Werkzeug           2.1.2
zipp               3.8.1

 

이제 프로젝트에서 실행을 해 보자.

성공!

현재 설치된 flask 버전과 requirements.txt 의 flask 버전이 달라서 비주얼 스튜디오가 뭐라고 하는데, 이건 requirements.txt 의 버전을 바꾸어 주어서 해결하자.  Flask~=2.1 정도로 바꾸면 되겠지.

이제 이 프로젝트를 수정해서, 내가 원하는 기능을 하는 웹페이지를 만들자.

728x90