programing

파이썬 애플리케이션을 정적 바이너리로 컴파일하는 방법이 있습니까?

padding 2023. 10. 25. 23:07
반응형

파이썬 애플리케이션을 정적 바이너리로 컴파일하는 방법이 있습니까?

제가 하려는 일은 코드를 원격 서버로 전송하는 것입니다. 원격 서버에는 다른 파이썬 버전이 설치되어 있거나 앱에 필요한 패키지가 없을 수도 있습니다.

바로 그러한 이식성을 달성하기 위해서는 인터프리터와 코드가 포함된 재배치 가능한 가상 환경을 구축해야 합니다.이러한 접근 방식에는 몇 가지 문제가 있습니다(예를 들어, 다음과 같이 여러 라이브러리를 가상 Env에 수동으로 복사해야 함).--always-copy예상한 대로 작동하지 않으며 일반적으로 느립니다.

파이썬 자체를 정적으로 만드는 방법이 (이론적으로) 있습니다.

제 코드가 들어간 인터프리터를 하나의 바이너리로 포장해서 제 어플리케이션을 모듈로 실행할 수 있는지 궁금합니다.그와 비슷한 것:./mypython -m myapp run아니면./mypython -m gunicorn -c ./gunicorn.conf myapp.wsgi:application.

당신이 당신의 문제를 해결하기 위해 할 수 있는 두가지 방법이 있습니다.

  1. 정지 빌더(static builder), 예를 들어 동결 또는pyinstaller, 아니면py2exe
  2. 을 사용하여 컴파일cython

이 답변에서는 첫 번째 방법이 플랫폼과 버전을 교차하지 않고 다른 답변에서 설명했으므로 두 번째 접근 방식을 사용하여 수행할 수 있는 방법에 대해 설명합니다.또한 pyinstaller와 같은 프로그램을 사용하면 일반적으로 파일 크기가 큰 반면 cython을 사용하면 파일 크기가 훨씬 작아집니다.

  1. 먼저 설치합니다.cython.

    sudo -H pip3 install cython
    
  2. 그러면 사용할 수 있습니다.cython파이썬에서 C 파일을 생성하다.py파일(https://stackoverflow.com/a/22040484/5714445) 참조)

    cython example_file.py --embed
    
  3. 현재 파이썬 버전을 가져온 후 GCC를 사용하여 컴파일합니다(참고:아래에서는 Python3)으로 컴파일을 시도하는 것으로 가정합니다.

    PYTHONLIBVER=python$(python3 -c 'import sys; print(".".join(map(str, sys.version_info[:2])))')$(python3-config --abiflags)
    gcc -Os $(python3-config --includes) example_file.c -o output_bin_file $(python3-config --ldflags) -l$PYTHONLIBVER
    

이제 바이너리 파일을 갖게 됩니다.output_bin_file, 당신이 찾고 있는 것은

기타 유의할 사항:

  1. 바꾸다example_file.py파일을 컴파일하려는 모든 파일에 적용할 수 있습니다.
  2. Cython은 Python 프로그램의 속도를 높이기 위해 정적 메모리 할당에 C-Type Variable 정의를 사용하는 데 사용됩니다.그러나 사용자의 경우 기존의 파이썬 정의를 그대로 사용하게 됩니다.
  3. 추가 라이브러리를 사용하는 경우(예:opencv, 예를 들어)를 사용하여 디렉토리를 사용자에게 제공해야 할 수 있습니다.-L다음을 사용하여 라이브러리의 이름을 지정합니다.-lGCC 플래그에서.이에 대한 자세한 내용은 GCC 플래그를 참조하시기 바랍니다.
  4. 콘다 파이썬과 호환되는 gcc 버전을 설치해야 할 가능성이 높기 때문에 아나콘다 파이썬에는 위 방법이 작동하지 않을 수 있습니다.

누이트카를 조사하고 싶으실 겁니다파이썬 소스 코드를 받아 C++ API 호출로 변환합니다.그런 다음 실행 가능한 이진 파일(Linux의 ELF)로 컴파일합니다.그것은 몇 년 전부터 존재해 왔으며 다양한 파이썬 버전을 지원합니다.

그것을 사용하면 성능도 향상될 것입니다.권장된.

Python 애플리케이션을 모든 라이브러리와 함께 정적 바이너리로 컴파일할 수 있는 Freeze와 같은 것을 찾고 있을 것입니다.

동결의 PyPi 페이지

동결의 파이썬 위키 페이지

Freeze의 Source Forge

Mac에 있는 경우 py2app을 사용하여 .app 번들을 만들 수 있으며, 이 번들을 두 번 클릭하면 Django 앱이 시작됩니다.

저는 https://moosystems.com/articles/14-distribute-django-app-as-native-desktop-app-01.html 에서 장고와 체리파이를 그런 묶음으로 묶는 방법을 설명했습니다.

기사에서 나는 pywebview를 사용하여 로컬 어플리케이션 창에 당신의 장고 사이트를 표시합니다.

동결 옵션:

그러나 대상 서버에 원하는 환경이 있어야 합니다. > '생성'할 수 있어야 합니다.그렇지 않다면 환경에 맞게 소프트웨어를 구축해야 합니다.

ssh 액세스 권한이 있는 경우 가상 env에 python의 사용자 지정 버전을 설치하는 방법에 대한 이 편리한 가이드를 찾았습니다. https://stackoverflow.com/a/5507373/5616110

virtualenv에서는 무엇이든 pip 설치할 수 있어야 하며 sudo 권한에 대해 걱정할 필요가 없습니다.물론 apt와 같은 패키지 관리자를 이용할 수 있으면 모든 것이 훨씬 쉬워집니다.

저는 정적 바이너리를 만들기 위해 Nuitka와 커스텀 정적 링크 python 3.10에 의존하는 도커 이미지를 만들었습니다.

광범위하게 테스트하지는 않았는데, 혹시 기회가 된다면 사용 사례에 적합한지 알려주세요.

https://github.com/joaompinto/docker-build-python-static-bin 에서 확인하실 수 있습니다.

언급URL : https://stackoverflow.com/questions/39913847/is-there-a-way-to-compile-a-python-application-into-static-binary

반응형