ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • pyinstaller로 실행프로그램 만들면서 빡쳤던점 정리
    python 2023. 1. 17. 14:00

    pyintaller는 실행프로그램을 만들 수 있는 python 패키지이다.

     

    python으로 자동화프로그램을 개발해서 넘길때 실행파일(exe)을 만들어야하는 상황이 종종 있는데, 가장 많이 사용하는 패키지인듯 하다. 

     

    어떤 경우에 사용하는지?

     - 나는 주로 테스트데이터의 ML모델을 붙여서 결과(예측값, 평가지표)를 엑셀파일로 만드는 자동화프로그램을 만드는데, 분명 이전과 동일한 방식으로 만들어도 버전차이 등의 이유로 다른 에러가 뜨는 경우로 인해 개발은 다했는데 이것때문에 야근을 하게되는 빡치는 상황을 다음에도 만나지 않기 위해 정리해두려고 한다. 

     

    이런걸로 야근하는게 개같다 이거예요

    이런걸로 야근하는게 개같다 이거예요

     

    [기본 명령어]

    - 설치

    pip install pyinstaller

     

    - 자동화파일(exe) 생성

    pyinstaller --onefile 파일명.py 

    깔끔하게 실행파일 하나 넘기기 위해 onefile 옵션을 반드시 추가해준다. 

     

     

    [Error case : No module named ~~ 생성한 실행프로그램이 scikit-learn을 가져오지 못한 경우]

    프로젝트에 관련 패키지 설치되어있음 & import 구문까지 모두 확인하였는데 실행프로그램으로 만들고나니 모듈이 없다고 나올 경우

     

    시도했던 방법1.

     - 모델과 스케일러를 pkl파일로 만들어서 스케일링 및 연산 시 pkl파일을 참조하게 함

     - 주의: 데이터셋마다 모델이 다른경우 데이터셋 건수만큼 모델을 만들어야하는 삽질 + 다른 데이터셋이 들어오면 모델이 없으므로 참조불가함

     - 결과:sklearn을 import하는 구문도 다 지웠는데도 동일한 에러뜸

     

     

    시도했던 방법2

     - 자동화파일 생성하는 명령어에 hidden-import 옵션 추가 

     - 테스트하면서 import하지못한 패키지명을 모두 넣어 명령어가 줄줄이사탕이됨.

     - 방법: pyinstaller --onefile predict-simulation.py 
     --hidden import=sklearn.metrics._pairwise_distances_reduction._datasets_pair --hidden-import=sklearn.metrics._pairwise_distances_reduction._middle_term_computer

     - 결과: 동일에러뜸

     

     

    시도했던 방법3

     - 원인파악 : 실행파일을 1번이상이라도 생성하면 python파일과 동일한 경로에 venv라는 폴더가 있음.

     - venv/Lib/site-packages/pyinstaller/hooks 경로 안에 프로젝트에 설치된 패키지별로 hook-패키지명.py 파일이 생성되어있는데, scikit-learn만 없음. 

     - 해결방법:

        1) venv/Lib/site-packages/pyinstaller/hooks 경로 내 hook-sklearn.py 생성하여 아래 코드 추가

    from PyInstaller.utils.hooks import collect_submodules
    
    hiddenimports = collect_submodules('sklearn')

     

        2) 실행파일 생성 시 hidden import에 sklearn 추가
    pyinstaller --onefile predict-simulation.py --hidden-import=sklearn

     

     

     

    [Error case : 실행파일을 넘겼는데 바이러스/악성코드가 포함된 파일이라고 컴플레인 들어온 경우]

     - 작년에 이것때문에 한달가까이 삽질했는데ㅗㅗㅗㅗㅗ 이전에 pyinstaller로 악성코드를 심어 배포한 경우가 많아, 보안프로그램 내 정책으로 악성코드유무 상관없이 pyintstaller로 빌드한 파일이면 무조건 위험한 파일이라고 인식한다고 한다.

     - 다른 패캐지를 사용하는수밖에 없다. 내 경우 pyinstaller를 버리고 cx_freeze라는 패키지를 사용했다.

     - cx_freeze의 장점은 바이러스/악성코드 탐지가 되지 않는다는 점이고 단점은 그 외이다. 사용하기 까다로운 패키지였다..

     -- 가장 중요한 onefile 옵션이 없다. 실행파일만 넘기면 실행이 되지 않는다. 환경파일까지 줄줄이 같이 배포해야한다. 내가 못찾은것일수도 있음.

     -- 그리고 실행프로그램을 생성한 당시 같이 생성된 환경파일이 있어야 실행이 가능하다. 

     

     

    앞으로도 에러케이스를 찾으면 계속 업데이트할 예정.

     

    댓글

Designed by Tistory.