세상에서 제일 짜증나는 일은 파이썬 다운그레이드가 분명합니다.

sanghyunna·2023년 7월 30일
0
post-thumbnail

배경

프로젝트 팀원이 로컬에서 작업하다가 깃헙에 올린 코드를 받아 다음 이슈를 작업하고 있었는데, 로컬에서 구동해보니 버전 오류 때문에 구동에 실패하게 되었다.

알고보니 팀원의 파이썬 버전은 3.10.5, 나의 버전은 3.11.0 이였고, EC2 Ubuntu에 설치된 버전이 3.10.6이였기 때문에 서로 EC2에 맞게 버전을 바꾸기로 했다.

시작

당연히 파이썬 내에 명령어가 있을 거라 생각한 나는 웹서핑을 열심히 해보았으나, 돌아온 결론은 3.11.0을 삭제하고 3.10.6을 재설치해야한다는 것이였다.

조금 귀찮아지긴 했으나 다시 작업해보았는데, 생각해보니 그동안 내가 로컬에서 작업한 모든 모듈은 3.11.0에 맞게 설치된 것이고, 이 때문에 requirements.txt에 맞지 않을 수도 있다는 것이다.

더구나 venv 역시 3.11.0 을 기준으로 생성되었으며, 이 경우는 다운그레이드할 수 없이 새로 생성해야 한다고 하여 기존 venv의 내용을 pip freeze > requirements.txt 로 저장한 후 venv 폴더를 삭제하였다.

문제 1

파이썬 3.11.0을 삭제한 후 파이썬 홈페이지에서 3.10.6을 다운로드 받고 설치하였다.

User@GBOOK-ULTRA MINGW64 /c/dev (main)
$ python --version
Python
(venv) 
User@GBOOK-ULTRA MINGW64 /c/dev (main)
$

이런 경우는 처음 보았지만 방금 바꿔서 그런가 싶어 터미널 재시작, 컴퓨터 재시작을 해보니 해결되었다.

$ python --version
Python 3.10.6

잘 해결되었다고 생각하고 python -m venv venv를 입력해 가상환경을 생성하였고, requirements.txt 를 설치하기 위해 pip install -r requirements.txt를 입력했다.
자꾸 아까 삭제한 파이썬 3.11 에 접근하려고 Python311 에 들어가길래 Python311을 삭제해주었다.

문제 2

/c/Python311/Scripts/pip: No such file or directory

3.11 버전은 분명히 삭제하고 폴더도 삭제했는데 저기를 찾는 걸 보니 분명 환경변수 문제인 듯 했다.

환경변수에서 Python311Python310으로 위치를 바꿔주려고 c드라이브를 찾아보니 3.10 버전의 폴더는 생성되지 않았다는 사실을 알게되었다.

처음에는 오류라 생각해 찾아보았지만, 알고보니 3.10까지의 버전은 C:\Users\(사용자이름)\AppData\Local\Programs\Python\Python310 에 저장된다는 사실을 알게 되었다.

근데 환경변수에서 기존의 Python311을 가리키는 폴더를 전부 지우고 Python310을 새로 변수로 두어도 문제가 해결되지 않았다.

심지어 pip까지 새로 설치해보았다. 이 과정에서 신기했던 점은, 이 링크에서는 pip를 설치할 수 있는 스크립트를 제공하는데, 제공하는 스크립트 안에 바이너리 데이터로 pip 파일이 통째로 들어있다는 점이였다. 아무래도 오프라인 환경에서의 설치를 고려하는 듯 했지만, 꽤 흥미로웠다.

아무튼 이것 저것 해보아도 해결되지 않자, 내가 사용하는 CLI인 Git Bash가 문제일 수 있다고 생각하고,

$ cd ~
$ touch .bashrc
$ nano .bashrc

를 입력하고 에디터에서

alias python='winpty c:/Users/(사용자이름)/AppData/Local/Programs/Python/Python310/python.exe'

를 입력해주었고, pip는 드디어 정상적인 코드를 뱉어주었다.

User@GBOOK-ULTRA MINGW64 /c/dev (main)
$ pip --version
pip 22.2.1 from C:\dev\test\venv\lib\site-packages\pip (python 3.10)

하지만 문제는 끝나지 않았다..

문제 3

(venv)
User@GBOOK-ULTRA MINGW64 /c/dev (main)
$ python manage.py runserver
Traceback (most recent call last):
  File "C:\dev\test\manage.py", line 11, in main
    from django.core.management import execute_from_command_line
ModuleNotFoundError: No module named 'django'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "C:\dev\test\manage.py", line 22, in <module>
    main()
  File "C:\dev\test\manage.py", line 13, in main
    raise ImportError(
ImportError: Couldn't import Django. Are you sure it's installed and available on 
your PYTHONPATH environment variable? Did you forget to activate a virtual environ
ment?

엥..?
장고 프로젝트인데 장고가 없다고 하길래 황급히 pip list를 돌려보았다.

(venv)
User@GBOOK-ULTRA MINGW64 /c/dev (main)
$ pip list
Package                       Version
----------------------------- -----------
absl-py                       1.1.0
altgraph                      0.17.2
asgiref                       3.6.0
...
Django                        4.1.7
django-allauth                0.51.0
django-cors-headers           3.14.0
...
keras                         2.9.0
Keras-Preprocessing           1.1.2

분명 설치가 돼 있었다..

pip install django를 해도 이미 설치되어 있다는 말과 함께, 오류가 사라지지 않았다.

여기서 제일 많이 고생하면서 이것저것 시도해보았지만
결국 해결법은 다음과 같았다.

일단 venv를 deactivate 한 후 삭제하고, 새 venv를 만든다.
이 때 장고를 설치하니 잘 설치되는 걸 확인했고, requirements.txt에 기록된 버전이 다른 점에서 영감을 얻었다.

기존 requirements.txt에 있던 내용을 전부 복사해서, 뒤에 버전 정보를 지우고, 앞에 pip install을 붙여서 싹 다 터미널에 우겨넣었다.

즉,

Django==4.1.7
django-allauth==0.51.0
django-cors-headers==3.14.0
django-storages==1.13.2
djangorestframework==3.14.0
djangorestframework-simplejwt==5.2.2

라고 되어 있는 requirements.txt를 복사해서 VScode의 Ctrl+Shift+L키를 이용해 아래와 같이 편집하고

pip install Django
pip install django-allauth
pip install django-cors-headers
pip install django-storages
pip install djangorestframework
pip install djangorestframework-simplejwt

이대로 복사해서 터미널에 넣었다.
모든 필요한 모듈의 호환 가능한 최신 버전이 설치될 것이기 때문에, 기존 requirements.txt의 버전 꼬임 문제를 해결할 수 있을 것 같았다.

그리고 결국

User@GBOOK-ULTRA MINGW64 /c/dev (main)
$ python manage.py runserver
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
July 30, 2023 - 20:48:04
Django version 4.2.3, using settings 'config.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.

성공적으로 실행되었다.

결론

버전 관리는 정말로 정말로 정말로 중요하다..
프로젝트를 시작하기 전에 정하고 가지 않는다면 나중에 큰 고통을 받는다는 깨달음을 얻게 되었다.
그나마 프로젝트가 많이 진행되지 않은 상태에서 경험했기에 싸게 막았다고 생각하고 있다.
버전 관리 확실히 하자!!

profile
wannabe dev

1개의 댓글

comment-user-thumbnail
2023년 7월 30일

좋은 글 감사합니다.

답글 달기