Cython을 사용하여 주요 Python 프로그램 컴파일


81

Cython을 사용하여 .so 파일로 컴파일 된 Python 모듈을로드 할 수있는 Python2.6 프로그램이 있습니다. Cython을 사용하여 .py 모듈을 .so 파일로 컴파일했으며 모든 것이 잘 작동합니다.

이것은 Cython과 함께 사용하는 setup.py 파일입니다.

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext

ext_modules = [
    Extension("ldap", ["ldap.pyx"]),
    Extension("checker", ["checker.pyx"]),
    Extension("finder", ["finder.pyx"]),
    Extension("utils", ["utils.pyx"]),
]

setup(
  name = 'bchecker',
  cmdclass = {'build_ext': build_ext},
  ext_modules = ext_modules
)

그래서 저는 Cython을 사용하여 Python 모듈을 컴파일 할 수 있다는 것을 알고 있습니다 (Cython은 제 Python 파일에서 'C'파일을 생성 한 다음 컴파일합니다).하지만 주 Python 프로그램을 Linux 플랫폼에서 실행할 수있는 것으로 컴파일 할 수 있습니까? 그렇다면 Cython 명령 줄 예제를 주시면 감사하겠습니다. 감사.


4
이 답변이 유용 했습니까? 이게 작동 했나요? 그렇다면 대답을 수락하십시오
— Mike Pennington

3
나는 이것이 표시되지 않을 것이라고 의심합니다. 사용자는 질문의 편집 날짜 다음 날 마지막으로 보았습니다.
— 남자 브로큰

답변:


152

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 버전 등.


이 임베딩 방법을 사용하여 실행 파일 대신 동적 라이브러리를 생성 할 수 있습니까?
— denfromufa 2014-06-02

5
모듈을 실행 파일로 컴파일하지 않습니다. 이식 가능한 실행 파일을 가질 수 있습니까? 즉, 소스 코드에서 가져온 모든 모듈이 해당 실행 파일로 컴파일됩니다. @BrokenMan
— Devesh Saini

1
@DeveshSaini 나는 그 비트를 알아내는 데 시간을 소비하지 않았습니다. 위와 같이 컴파일하기 위해 완전한 파이썬 + Pyside 애플리케이션을 얻을 수 있었던 유일한 방법은 일반적인 방식으로 프로그램을 개발하는 것입니다. 그런 다음 모든 것이 준비되면 포함 된 모든 코드를 수동으로 붙여넣고 교체 한 관련 include 문을 주석 처리합니다. 예, 바람직하지 않지만 처음에 말했듯이 메인 루틴 만 컴파일하고 포함 된 모듈을 함께 링크하는 방법을 확인하는 데 시간을 소비하지 않았습니다.
— Broken Man

3
libpython의 정적 링크는 어떻습니까?
— James Mills

4
파이썬 2.7 cython --embed -o /tmp/a.c a.py및gcc -Os -I /usr/include/python2.7 -o /tmp/a/tmp/a.c -lpython2.7 -lpthread -lm -lutil -ldl
— dsaydon

17

Cython이 EXE로 컴파일 할 수 있습니까?에 대한 답변을 살펴보십시오 . 여기에있는 다른 모든 답변과 달리 예, 실행 파일로 컴파일 할 수 있습니다.

Embedding Cython 의 링크는 시작하기에 좋은 곳인 것 같지만 Cython의 주요 목적이 아니므로 얼마나 간단할지 모르겠습니다.


1
링크 주셔서 감사합니다. 또한 Python을 사용하여 실행 코드가 포함 된 .so 파일을 만들 때 가능할 수도 있다고 생각합니다.
— mozza

4

이것이 도움이 될지 모르겠지만 Nudzo가 맞습니다. 당신은 그것을 얻을 수 있고 cython --embed -o main.o main.py나는 cl / EHsc로 결과를 컴파일하려고합니다.


-21

그럴 수 없습니다. Cython은 Python을 컴파일하거나 실행 파일로 변환하지 않습니다.

.exe 파일을 생성하려면 py2exe를 사용하십시오 .

Mac 또는 Linux 용 패키지를 생성하려면 Unix env의 스크립트 언어 프로그램에 대해 특정하지 않으므로 정규화 된 패키징 시스템 프로세스를 사용하십시오.


2
내 .py 파일을 .so 파일로 바꿀 수 있습니다. 내가 사용하는 위의 스크립트를 참조하십시오. .so 파일에 실행 코드가 포함되어 있지 않습니까?
— mozza

목적이 아닙니다. Cython은 C / C ++ Python 확장을 컴파일하기위한 것이며 Python 스크립트를 실행 파일로 바꾸지 않습니다.
— e-satis

10
오보. 거기에 cython --embed포함 파이썬 실행 파일을 생성 할 수있다.
— nudzo 2014 년

결과 실행 파일은 정적으로 링크하지 않는 한 libpython에 계속 의존합니다. 또한 모든 파일에서 하나의 실행 파일을 생성하지 않고 진입 점에서 하나의 실행 파일을 생성합니다.
— e-satis 2014 년

2
@ e-satis 예, 실행 파일은 당시 컴파일 된 libpython 버전에 동적으로 연결됩니다. 무엇이 문제입니까? Linux 용이고 애플리케이션을 배포 할 계획이라면 다른 모든 바이너리 패키지와 마찬가지로 원하는 Linux 배포 형식으로 패키지화하면됩니다. 예를 들어 myapp_1_wheezy_amd64.deb는 해당 배포판의 python2 또는 python3에 연결된 컴파일 된 Python 앱입니다. Windows의 경우 필요한 파이썬을 제공하십시오. 다시, 나는 여기서 문제 또는 이의를 보지 못합니다.
— Broken Man
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.