힘들게 윈도우로 빌드 성공하고..
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 내부 라이브러리 빌드용으로 수정
이 삽질은 이전 글을 참조하면 좋다.
이렇게까지 하면 정말 다왔다..!
빌드가 끝나면 /dist/main 폴더에 main 파일이 있을텐데
이 파일을 ls -al 명령어로 확인해보면 실행 권한이 주어져있지 않다.
9. Linux 환경에서 pyinstaller 빌드파일 실행권한 주기
sudo chmod 777 ./dist/main/main
이제 실행하면 정말 된다..
이 빌드파일을 회사에있는 다른 CentOS에 복사해서 실행해봐도 정상적으로 아주 잘 동작하였다..!!
'공부 > Python' 카테고리의 다른 글
[python] pandas를 활용한 간단한 csv to tsv 또는 tsv to csv (0) | 2021.09.28 |
---|---|
[pandas] 대한민국 주소체계 분리해서 사전만들기 (0) | 2021.07.09 |
[python] pyinstaller jinja2.PackageLoader Error (0) | 2021.06.24 |
[python] pyinstaller 와 빌드 후 ini 환경변수 읽기(konfig) (1) | 2021.06.19 |
[python] pyinstaller 일곱번의 삽질 for uvicorn + FastAPI (1) | 2021.06.18 |
댓글