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


86

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

지금 당장은 이러한 이식성을 달성하기 위해 인터프리터와 코드를 사용하여 재배치 가능한 virtualenv를 구축해야합니다. 이 접근 방식에는 몇 가지 문제가 있으며 (예 --always-copy: 예상대로 작동하지 않으므로 여러 라이브러리를 수동으로 virtualenv에 복사해야 함 ) 일반적으로 느립니다.

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

내 코드와 함께 인터프리터를 하나의 바이너리로 압축하고 내 애플리케이션을 모듈로 실행할 수 있는지 궁금합니다. 비슷한 것 : ./mypython -m myapp run또는 ./mypython -m gunicorn -c ./gunicorn.conf myapp.wsgi:application.


cx_freeze와 같은 것을 의미합니까?
TigerhawkT3 2010 년

@ TigerhawkT3, 오늘까지 cx_freeze에 대해 들어 본 적이 없습니다. 문서를 살펴보면 내가 원하는 것처럼 보이지만 python3.5.1로 Ubuntu 12.04.5에서 빌드하지 못했습니다. 저는 대안을 찾고 있습니다. 올바른 방향으로 차 주셔서 감사합니다.
roboslone

슬프게도, pyInstaller 중에 장고 1.9 py2app하지 작업을 수행 / py2exe에는 :( 리눅스를 지원하지 않습니다
roboslone

2
cx_Freeze 및 pyinstaller가 작동하지 않으면 여전히 희망이 있습니다. 설치에 대한 모든 종속성을 해결할 대상 배포 용 패키지를 만들 수 있습니다. 또는 Docker와 같은 것을 사용하여 앱을 실행할 수도 있습니다.
KeatsPeeks 2016 년

1
다른 옵션 nuitka와 사이 썬 있습니다
denfromufa

답변:


121

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

  1. 고정, 또는 같은 정적 빌더를 사용 pyinstaller하거나py2exe
  2. 다음을 사용하여 컴파일 cython

첫 번째 방법은 크로스 플랫폼 및 버전이 아니며 다른 답변에서 설명했기 때문에 두 번째 방법을 사용하여 수행하는 방법을 설명합니다. 또한 pyinstaller와 같은 프로그램을 사용하면 일반적으로 파일 크기가 커지며 cython을 사용하면 KB 크기의 파일이 생성됩니다.

먼저 cython. 그런 다음, 파이썬 파일 (예를 들어 이름을 변경 test.py로) .pyx파일

sudo pip install cython
mv test.py test.pyx

그런 다음 cythonGCC와 함께 사용 하여 컴파일 할 수 있습니다 ( cythonPython .pyx파일에서 C 파일을 생성 한 다음 GCC가 C 파일을 컴파일합니다).

( https://stackoverflow.com/a/22040484/5714445 참조 )

cython test.pyx --embed
gcc -Os -I /usr/include/python3.5m -o test test.c -lpython3.5m -lpthread -lm -lutil -ldl

참고 : Python 버전에 따라 마지막 명령을 변경해야 할 수 있습니다. 사용중인 Python 버전을 확인하려면 다음을 사용하십시오.

$ python -V

이제 찾고있는 바이너리 파일 'test'가 있습니다.

참고할 기타 사항 :

  1. Cython은 정적 메모리 할당에 C-Type 변수 정의를 사용하여 Python 프로그램의 속도를 높이는 데 사용됩니다. 그러나 귀하의 경우에는 여전히 전통적인 Python 정의를 사용합니다.
  2. 추가 라이브러리 (예 :)를 사용하는 경우를 사용 opencv하여 디렉토리를 제공 -L한 다음 -lGCC 플래그에서 사용하는 라이브러리 이름을 지정해야 할 수 있습니다 . 이에 대한 자세한 내용은 GCC 플래그를 참조하십시오.

20
안녕, 내 응용 프로그램이 여러 파일에 걸쳐 있으면 어떻게 될까요? 이 접근 방식은 모든 Python 종속성이 아닌 현재 스크립트 만 컴파일하는 것 같습니다.
RChat

2
필요가 지금 PYX에 파이썬 파일 (말의 test.py를) 이름을 바꾸려면
iMath

3
이것은 저에게 큰 도움이되었습니다. 여러 파일에 대한 질문에 답하려면 cythonize를 사용할 수 있습니다. cythonize -i file_0.py [...] file_n.py모든 Python 모듈에 cython main_file.py --embed대해 다음 기본 스크립트에 대해. 독립형 솔루션으로 함께 사용할 수있는 실행 파일 및 .so 파일 (OS에 따라 .dll, .dylib)이 생성됩니다.
afp

"인코딩이라는 모듈이 없습니다"라는 메시지가 나타납니다. 파이썬 설치에서 특정 파일이 필요하다는 것을 알게되었습니다. 그러나 내 대상 시스템에는 파이썬이 없습니다. 도와주세요.
abhiarora

9

Nuitka 를 조사하는 것이 좋습니다 . 파이썬 소스 코드를 받아 C ++ API 호출로 변환합니다. 그런 다음 실행 가능한 바이너리 (Linux의 ELF)로 컴파일됩니다. 몇 년 동안 사용되어 왔으며 다양한 Python 버전을 지원합니다.

사용하면 성능이 향상 될 수도 있습니다. 추천합니다.


Django에서 Nuitka를 사용하는 방법에 대한 정보를 찾을 수 없습니다. 혹시 그런 경험이 있습니까?
roboslone

@roboslone, Prakhar Agarwal Cython은 Nuitka PyPy의 정적 빌더와 비교할 때 외부 라이브러리를 정말 잘 지원합니다. 예를 들어,이 주석 끝에있는 링크에서 "사람들은 문제를 해결하는 데 도움이되기 때문에 Cython을 사용합니다. 즉, Python 코드에서 Python이 아닌 외부 라이브러리에 연결하기를 원하거나 할 수 있기를 원합니다. 수동으로 코드, 또는 둘 모두를 최적화 "링크되고. blog.behnel.de/posts/indexp241.html
RS Nikhil 크리슈나

1
RS Nikhil Krishna, 저는 제 코드를 더 빨리 만들려고하는 것이 아닙니다. 파이썬 인터프리터가 내장 된 하나의 바이너리로 보내려고합니다.
roboslone

아 알았어. 나는 당신이 그것을 외부 라이브러리와 묶고 싶다고 생각했습니다. 내 잘못이야.
RS Nikhil Krishna


1

Mac을 사용하는 경우 py2app을 사용하여 .app 번들을 생성 할 수 있으며,이를 더블 클릭하면 Django 앱이 시작됩니다.

https://moosystems.com/articles/14-distribute-django-app-as-native-desktop-app-01.html 에서 Django와 CherryPy를 번들로 묶는 방법을 설명했습니다.

이 기사에서는 pywebview를 사용하여 로컬 애플리케이션 창에 Django 사이트를 표시합니다.


내 응용 프로그램은 대부분 Linux에서 실행되므로 py2app이 적용되지 않습니다
roboslone

이 기사에서는 py2app을 사용하지만 pyinstaller를 사용하여 수행 할 수도 있습니다.
André Aulich

0

고정 옵션 :

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

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

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


이미 virtualenv를 사용하고 있지만 그렇지 않습니다. 내 질문은 정적으로 컴파일 된 파이썬 witn 필수 모듈 및 응용 프로그램에 관한 것입니다.
roboslone

그런 다음 고정해야합니다. 다른 방법은 없습니다.
iScrE4m
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.