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.pygcc -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.