본문 바로가기
공부/Python

[python] pyinstaller centOS에서 빌드하기(docker)

by 병진들 2021. 6. 25.

힘들게 윈도우로 빌드 성공하고..

Ubuntu20.04로 빌드도 긴 삽질끝에 성공했지만

실제로 회사에서 필요한건 CentOS였다.

 

Pyinstaller 정말 편하고 누가 만들었는지 잘 만든거 인정하지만 운영체제마다, 심지어 같은 리눅스 계열이어도 Ubuntu에서 빌드한게 CentOS에서 실행이 안될 줄은 몰랐다.. ㅠㅠ

 

Ubuntu에서 빌드한 파일을 CentOS에서 실행하게 되면 뜨는 Error 메세지

Error loading Python lib '/home/user/AI/main/libpython3.8.so.1.0': dlopen: /lib64/libm.so.6: version `GLIBC_2.29' not found (required by /home/user/AI/main/libpython3.8.so.1.0)

 

이번 삽질은 CentOS에서 pyinstaller 빌드하기 이다..!

참고로 Ubuntu20.04 내부에서 docekr CentOS Image를 다운받아서 사용하였다.

 

 

1. docker Volume 설정과 동시에 CentOS 만들기

# buildfile: docker와 공유할 Dir
docker run -it -v /home/user/buildfile:/data --name d_name centos /bin/bash

 

ubuntu 내부에 있는 폴더와 docker 를 연결해주는 volume을 설정하고 CentOS 컨테이너를 생성해준다.

 

이제 그냥 pyinstaller 설치해서 룰루랄라 잘 설치하면 되겠지 라고 생각했지만 당연하게도 그럴리가 없지.

앞으로 발생할 에러에 대해 차근차근 정리해본다.

주요 Error 

  • gcc Error : bottlenect Error
  • ERROR: Could not build wheels for lib_name which use PEP 517 and cannot be installed directly
  • ImportError: C extension: No module named 'pandas._libs.tslibs.np_datetime' not built. If you want to import pandas from the source directory, you may need to run 'python setup.py build_ext --inplace --force' to build the C extensions first.
  • 앞으로 더 생길 예정

 

2. 일단 yum을 업데이트 해준다

yum update

pip install, pyinstaller 실행할때 pycaret을 적용하다보면 PEP Error, gcc : bottlenect Error 같은게 나온다.

python 버전도 문제고, pyinstaller와 centos 호환도 문제고.. 미리 방지하자

 

3. gcc설치 및 python 버전 호환성 맞추기

yum install gcc
yum install python38
yum install python38-devel

꼭 해야한다.. 그래야 나중에 빌드할 때, 문제가 생기지 않는다

 

4. python 가상환경 만들기

python3 -m venv NAME

가상환경을 만드는 이유는 docker환경이기 때문에, Volume 위에서 작업을 해줘야 편하다.

만약 가상환경을 만들지 않고 그냥 python 패키지를 사용하게되면 나중에 pip 내부 모듈을 수정해 줘야 할 일이 있을때 너무 번거로워진다.. (경험담임)

 

5. pip install pycaret을 위한 wheel 맞추기

pip3 install --upgrade pip setuptools wheel

이 작업을 하지 않으면 pycaret 패키지에 포함되어있는 bottlenect Lib에서 계속해서 에러가 발생할 것이다.

이거 해줘도 에러가 발생했다면 분명 위3번 작업을 하지않았을것이다. (내경험담)

 

6. 필요 패키지 설치

pip3 install -r requirements.txt

 

제대로 했다면 설치가 깔끔하게 끝날것이다.

 

하지만 이렇게 쉽게 끝날리가 없다.

 

 

분명 python main.py 로 실행은 잘 되지만 빌드 후에 실행해보면

  • ImportError: C extension: No module named 'pandas._libs.tslibs.np_datetime' not built. If you want to import pandas from the source directory, you may need to run 'python setup.py build_ext --inplace --force' to build the C extensions first.

이런 에러가 발생할 것이다. pandas Lib가 제대로 hooking 되지 않은문제인데 이전에 이런삽질은 굉장히 많이했기 때문에 쉽게 해결하였다.

 

7. main.spec 파일의 hidden import 파일 수정

hiddenimports=[
				'uvicorn.lifespan.off',
				'uvicorn.lifespan.on',
				'uvicorn.lifespan',
				'uvicorn.protocols.websockets.auto',
				'uvicorn.protocols.websockets.wsproto_impl',
				'uvicorn.protocols.websockets_impl',
				'uvicorn.protocols.http.auto',
				'uvicorn.protocols.http.h11_impl',
				'uvicorn.protocols.http.httptools_impl',
				'uvicorn.protocols.websockets',
				'uvicorn.protocols.http',
				'uvicorn.protocols',
				'uvicorn.loops.auto','uvicorn.loops.asyncio','uvicorn.loops.uvloop','uvicorn.loops',
				'uvicorn.logging',
				'pandas._libs.tslibs.base',
				'pandas._libs.tslibs.timedeltas', 
				'pandas._libs.tslibs.np_datetime', 
				'pandas._libs.tslibs.nattype', 
				'pandas._libs.skiplist'
			 ],

뭔가 많은것 같지만.. 추가하다보니까 이렇게..

 

그리고 또 바로 되면 당연히 좋겠지만 pands는 호락호락하지 않다.

 

8. pandas 내부 라이브러리 빌드용으로 수정

이 삽질은 이전 글을 참조하면 좋다.

https://bslife.tistory.com/79

 

[python] pyinstaller jinja2.PackageLoader Error

기존에 만들었던 pyinstaller 패키징에 에 많은 삽질이 있었지만 이 삽질은 거의 3일짜리였다.. 기존 삽질 로그 : https://bslife.tistory.com/76?category=767584 [python] pyinstaller 일곱번의 삽질 for uvicor..

bslife.tistory.com

 

이렇게까지 하면 정말 다왔다..!

 

빌드가 끝나면 /dist/main 폴더에 main 파일이 있을텐데

이 파일을 ls -al 명령어로 확인해보면 실행 권한이 주어져있지 않다.

 

9. Linux 환경에서 pyinstaller 빌드파일 실행권한 주기

sudo chmod 777 ./dist/main/main

 

이제 실행하면 정말 된다.. 

 

이 빌드파일을 회사에있는 다른 CentOS에 복사해서 실행해봐도 정상적으로 아주 잘 동작하였다..!!

 

 

 

댓글