ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Python] 파이썬 코드 배포하기
    기타 코딩 2024. 3. 1. 18:15

    파이썬으로 작성된 프로그램을 다른 사람들에게 배포할 때, 그 사람 컴퓨터에 원하는 버전의 파이썬이 설치되어있으며, 기존에 설치된 라이브러리와 버전 의존성이 충돌하지 않을 것이라 생각하기는 어려울 것이다. 따라서 PyInstaller와 같은 모듈을 사용하여 배포용 exe파일로 만들어주게 된다. 문제는 이것이 완벽한 것은 아니라서 필요한 라이브러리를 빼먹어 실행이 안되는 경우가 발생한다는 것이다. 이때 사용할 수 있는 방법 중 하나는 python embeddable package를 사용하는 것이다.

    https://www.python.org/downloads/windows/

     

    Python Releases for Windows

    The official home of the Python Programming Language

    www.python.org

     

    1. Python Embeddable Package 준비

    mkdir python311
    cd python311
    curl https://www.python.org/ftp/python/3.11.6/python-3.11.6-embed-amd64.zip -o python.zip
    unzip python.zip
    del python.zip
    cd ..
    
    curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
    python311\python.exe get-pip.py --no-warn-script-location
    del get-pip.py
    
    echo Lib\site-packages >> python311/python311._pth
    
    python311\python.exe -m pip install numpy pandas matplotlib PyQt5 --no-warn-script-location

    위 코드는 python311 폴더를 만들어서, python embeddable package를 다운 받은 뒤, 압축해제, pip를 설치, pip로 필요한 패키지를 설치하는 과정을 cmd 스크립트화 한 것이다.

    이때 pip로 설치하기 전 echo 문은 python._pth 파일에 위와 같이 Lib\site-packages를 추가하는 명령이다. 여기서 python._pth 파일은 모듈을 찾을 위치를 기록해두는 파일이며,  Lib\site-packages는 pip가 설치할 패키지의 경로이다.

    (참고로 기본 파이썬은 윈도우일 경우 C:\Users\{USER NAME}\AppData\Roaming\Python\Python311\site-packages에 설치된다.)

    2. exe 파일 만들기

    빌드를 하고, 프로그램을 실행시켜본 뒤라 obj, json 파일이 있는데, python이 있는 폴더와 실행시킬 py 파일, exe 파일을 만들 c 소스 파일만 있으면 된다.

    #pragma comment(linker, "/subsystem:windows")
    
    #include <windows.h>
    
    int APIENTRY wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpszCmdParam, int nCmdShow) {
        WinExec("cmd.exe /c python311\\pythonw.exe func_substitute.py", SW_HIDE);
    }

     

    Window API에 있는 WinExec를 이용해서 내장된 인터프리터로 파이썬 코드를 실행시키는 코드이다.

    system 함수를 사용하면, cmd 창이 보이기 때문에 좋지 않으며, python대신 pythonw를 사용해서 실행시킨 이후에도 콘솔창이 나타나지 않도록 하였다. 파이썬 코드에 GUI를 넣지 않았다면, system 함수와 python을 사용하면 된다.

     

    빌드는 Visual Studio Community나 Visual Studio BuildTools에 C++ 개발도구를 설치하면 나오는 cmd 창에서 진행하여야 한다. Developer Command Prompt를 사용하면 기본 32 비트로 설정되므로 64비트로 빌드하고 싶다면 vcvarsall x64, vcvars64를 실행시키거나, 처음부터 64비트 툴에서 진행하여야 한다.

    c 소스 파일이 있는데 까지 cd 명령어로 찾아간 다음 아래 명령어를 통해 빌드한다.

    cl func_substitute.c /O2 /utf-8

    참고로 mingw를 사용해서 빌드하는 경우, dll 누락으로 실행되지 않는 컴퓨터가 있을 수 있다. 아래 사진은 PyQt로 만든 프로그램이다.

    exe 파일, 파이썬 소스, 내장 파이썬 설치 스크립트를 한 폴더에 배포하면 된다.

    설치하는 사람은 스크립트를 한 번 실행시켜준 다음 exe파일을 실행하면 파이썬이 없는 환경에서도 실행된다.

     

    이 방법은 PyInstaller에 비하면 조금 손이 가겠지만, 보다 컴팩트하고, 패키지 누락으로 실행이 안되는 등의 문제가 발생할 여지가 거의 없다. 다음에는 C++에 파이썬을 내장하는 방법을 소개할 것이다.

    댓글

Designed by Tistory.