Adam Matan과 다른 사람들이 주장하는 것과는 달리, 실제로 순수 Python (.py) 파일에서 Cython을 사용하여 단일 실행 바이너리 파일을 만들 수 있습니다 .
예, Cython은 CPython python 런타임 용 C / C ++ 확장 모듈 작성을 단순화하는 방법으로 명시된대로 사용하도록되어 있습니다.
그러나 nudzo가이 주석 에서 언급했듯이 --embed
명령 줄 프롬프트에서 스위치를 사용할 수 있습니다 .
다음은 매우 간단한 예입니다. python3 및 cython3을 사용하여 Debian Sid 워크 스테이션에서이 작업을 수행하고 있습니다.
python-dev 또는 python3-dev 패키지가 미리 설치되어 있는지 확인하십시오 .
1) hello.py 라는 매우 간단한 Python 프로그램을 만듭니다.
$ cat hello.py
print ( "안녕하세요!")
2) Cython을 사용하여 파이썬 프로그램을 C로 컴파일하십시오.
cython3 --embed -o hello.c hello.py
3) 사용 GCC라는 실행 파일로에서는 hello.c를 컴파일 안녕하세요 ...
gcc -Os -I /usr/include/python3.3m -o hello hello.c -lpython3.3m -lpthread -lm -lutil -ldl
4) 당신은 hello 라는 파일로 끝납니다 ...
$ 파일 안녕하세요
hello : ELF 64 비트 LSB 실행 파일, x86-64, 버전 1 (SYSV), 동적 연결 (공유 라이브러리 사용), GNU / Linux 2.6.32 용, BuildID [sha1] = 006f45195a26f1949c6ed051df9cbd4433e1ac23, 제거되지 않음
$ ldd hello
linux-vdso.so.1 (0x00007fff273fe000)
libpython3.3m.so.1.0 => /usr/lib/x86_64-linux-gnu/libpython3.3m.so.1.0 (0x00007fc61dc2c000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fc61da0f000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fc61d70b000)
libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00007fc61d508000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fc61d304000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fc61cf5a000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fc61cd52000)
libexpat.so.1 => /lib/x86_64-linux-gnu/libexpat.so.1 (0x00007fc61cb28000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007fc61c90f000)
/lib64/ld-linux-x86-64.so.2 (0x00007fc61e280000)
이 경우 실행 파일은 내 Debian 시스템의 Python 3.3에 동적으로 연결됩니다.
5) 안녕하세요 실행 ...
$ ./ 안녕하세요
안녕하세요!
보시다시피,이 방법을 사용하면 기본적으로 Cython을 사용하여 순수 Python 응용 프로그램을 실행 가능한 컴파일 된 개체 코드로 변환 할 수 있습니다.
이 방법은 훨씬 더 복잡한 응용 프로그램 (예 : 완전한 Python / PySide / Qt 응용 프로그램)에 사용하고 있습니다.
다른 버전의 Python의 경우 gcc -I
및 -l
스위치를 적절하게 조정합니다 .
그런 다음 Python / PySide / Qt 파일을 패키징 할 필요없이 실행 파일을 배포 (.deb 등) 파일로 패키징 할 수 있습니다. 이점은 동일한 배포 업데이트 후에도 애플리케이션이 계속 실행될 수 있다는 것입니다. 해당 배포판의 Python 버전 등.