본문 바로가기

coding/Trouble shooting

Building wheel for mysqlclient (pyproject.toml) did not run successfully

무려 4일간 나를 하루종일 아무고토 못하게 했던..

배포는 아직도 어렵다. 가상환경의 리눅스 서버를 내가 컨트롤 한다는게 아직 익숙하지 않기도 하고...

무엇보다 Paas... 내가 가상환경의 시스템 패키지나 라이브러리를 맘대로 설치를 못한다.

규격과 틀이 정해져있다는건 정말 어떻게 보면 장점인데 이럴땐 단점이다. 트러블슈팅이 힘드뤄..

 

일단 내 에러 상황은 아래와 같았다~

1. 로컬에서는 잘 돌아감.

2. 배포가 원래 잘 됐었음

3. 하지만 어느날 배포 중 아래와 같은 에러 발생하면서 배포가 실패됨.

 × Building wheel for mysqlclient (pyproject.toml) did not run successfully.
  │ exit code: 1
  ╰─> [59 lines of output]
      Trying pkg-config --exists mysqlclient
      Command 'pkg-config --exists mysqlclient' returned non-zero exit status 1.
      Trying pkg-config --exists mariadb

 

위와 같은 에러가 발생하는 이유는 여러가지가 있다구 함니당.

챗지피티 선생님께서 아래와 같은 이유때문이라고 한다.

  1. 시스템 라이브러리 의존성 부족: mysqlclient 라이브러리는 MySQL 또는 MariaDB의 개발 파일(예: libmysqlclient-dev 또는 libmariadbclient-dev)에 의존합니다. pkg-config --exists mysqlclient 또는 pkg-config --exists mariadb 명령이 non-zero exit status를 반환한다는 것은 이러한 시스템 라이브러리가 배포 환경에 설치되어 있지 않다는 것을 의미합니다.
  2. 환경 특성: 배포 환경(예: Azure App Service, AWS EC2, 등)에 따라, 기본적으로 제공되는 시스템 라이브러리가 다를 수 있습니다. 개발 환경에서는 문제가 발생하지 않았지만, 배포 환경에서는 필요한 시스템 라이브러리가 누락되어 있을 수 있습니다.
  3. Wheel 빌드 실패: Python 라이브러리는 보통 소스 코드 형태로 배포되며, 설치 시점에 시스템에 맞게 컴파일되어 wheel 파일로 빌드됩니다. mysqlclient의 경우, 이 과정에서 시스템에 설치된 MySQL/MariaDB 개발 라이브러리에 대한 참조가 필요합니다. 이러한 의존성이 충족되지 않으면 wheel 빌드 과정에서 에러가 발생합니다.

한줄요약 -> 내 가상환경의 시스템 라이브러리에서 어떠한 이유에서, mysqlclient 라이브러리를 찾지 못해서 발생하는 에러

 

자 여기서 Mysqlclient란? Python에서 Myql 데이터베이스에 접근하기 위한 라이브러리 이다. 

위 에러의 해결방법은 세 가지가 있겠다.

  1. 시스템 라이브러리에 Mysqlclient를 직접 설치하기
  2. Mysqlclient를 사용하지 않고 ,대체재인 pymysql를 사용하기
  3. Dockerfile에 직접 필요한 종속성 작성해서 컨테이너 이미지 추가하기

하지만 나는 배포 초보.. 도커랑 컨테이너가 모죠?

그리고 Paas라서 시스템 라이브러리에 직접 설치는 안된댄다.

 

최대한 도커파일 작성하는건 나중으로 미루고, 2번이 제일 간단하대서 pymysql을 사용하려 했다.

Pymysql은 Mysqlclient와 같이 python에서 mysql 데이터베이스에 접근하게 해주는 라이브러리인데, 중요한건 mysqlclient는 c로 구현되었고 pymysql은 순수 python으로 구현되었다는 점이 다르다. 따라서, Pymysql은 다른 종속성이 필요 없기때문에 오류가 나지 않을것이니,,, pymysql로 바꾸라는 것이었당.

 

따라서 다음의 단계를 거쳐서 코드를 수정했다.

 

1. Pymysql 설치

pip install pymysql

 

2. __init__.py 에 코드 추가 (프로젝트 폴더에 있는 init.py에 추가해줘야 함)

import pymysql
pymysql.install_as_MySQLdb()

 

3. requirements.txt 에서 종속성 삭제

#terminal
pip freeze > requirements.txt

#requirements.txt
mysqlclient = x.x.x -> 삭제

 

한껏 부푼 마음을 안고 다시 배포를 하는데.. 안됨.

심지어 오류 내용도 똑같아. 여기서부터 3일간의 삽질이 시작됐다.

진짜 별짓을 다해본거 같다.. azure web app 다시 만들어보고 resource group도 다시 만들어봤다.

 

더웃긴건 azure 문제인줄 알고 aws elastic beanstalk로 옮겨봤다. (aws eb 사용성이 별로여서 azure로 돌아왔다는건 안비밀..ㅎ)

하지만 eb는 로그 뽑아내는게 너무 번거로워서 다시 azure로 돌아와서 이것저것 만져보고 구글링도 엄청 많이 해봤다.

 

로그 내용을 찬찬히 다시 읽어보니 가장 큰 문제가 있었다. 다음로그를 살펴보자. 내 깃 워크플로우에서 명령어 pip install -r requirements.txt를 실행하면 나오는 로그다.

Collecting mysqlclient (from mysql==0.0.3->-r requirements.txt (line 27))
Downloading mysqlclient-2.2.4.tar.gz (90 kB)

 

이게 무슨말이냐 하면, 내 requirements.txt에 mysqlclient가 없어도, mysql==0.0.3 이 mysqlclient를 필요로 하니 이것도 깔게~ 라는 말이다. 몽총한 나는 이것도 모르고 azure은 애져만 탓하고 있었으니...ㅠ

 

심지어 stackoverflow에도 나와 같은 사람이 있었다ㅋㅋ

https://stackoverflow.com/questions/77417874/amazon-eb-deploy-django-application-why-it-install-mysqlclient2-2-0/78144887#78144887

 

Amazon EB: Deploy Django Application, why it install mysqlclient2.2.0?

I have been creating and deploying django applications for testing purposes.(platform: Python 3.8 running on 64bit Amazon Linux 2) When I create an environment, and I do "eb deploy" comma...

stackoverflow.com

답변 내가 하나 달아쥼..ㅎ

 

아무튼 'mysql == 0.0.3' 이 라이브러리가 뭔데 나를 이렇게 고통스럽게 했을까 해서 찾아봤다.

mysql 패키지는 가상 패키지로, 실제로는 mysqlclient패키지를 설치하게 되는 패키지(python 3에서~) 라고 합니다.

 

ㅎ.. 그러니까 아무리 mysqlclient를 requirements.txt에서 지워봤자, mysql 패키지는 강제로 mysqlclient를 깔게 했던것.

원래라면 requirements에 mysql, mysqlclient모두 없애고 pymysql만 있어야 했었다ㅎ

 

해결했으니 됐다... 4일간의 삽질은 여기서 마무리닷