2012-04-18 7 views
18

나는 python을 탐험 중이다. 파이썬 바인딩에 대해 궁금합니다. 파이썬에서 C 라이브러리에 액세스 할 수있는 방법은 누구나 설명 할 수 있습니다.파이썬 바인딩, 어떻게 작동합니까?

+1

[extemb]의 일부 (http://docs.python.org/extending/index.html) 당신이 이해하지? –

+1

"파이썬 C 바인딩"에 대한 Google 검색을 제안합니다. – steveha

+2

"나는 파이썬을 탐험 중입니다."모든 Python에 대해 배우는 것은 좋은 일이지만, C 바인딩을 너무 자세히 살펴보기 전에 Python 모델을 잘 이해하고 있어야합니다. 운전 방법을 알면 파워 스티어링 장치가 어떻게 작동하는지 훨씬 잘 이해할 것입니다. . –

답변

25

C로 작성된 코드를 Python에서 호출하는 방법에는 여러 가지가 있습니다.

먼저 표준 라이브러리에 ctypes 모듈이 있습니다. 동적 링크 라이브러리 (Windows에서는 DLL, Linux에서는 공유 라이브러리 .so)를로드하고 Python에서이 라이브러리의 함수를 호출 할 수 있습니다. 이러한 라이브러리는 대개 C로 작성됩니다.

두 번째로 CPython의 경우 Python/C API가 있습니다. 이것은 두 가지 주요한 방법으로 사용될 수 있습니다 :

다이나믹 링크 라이브러리는 CPython이 모듈로 취급 할 수 있도록 작성 될 수 있습니다 (파이썬 프로그램에서 가져올 수 있습니다). Python/C API는 라이브러리가 C로 작성되었지만 여전히 Python에서 호출 할 수있는 함수를 정의 할 수있게합니다. API는 매우 강력하며 모든 파이썬 데이터 유형을 조작하고 인터프리터의 내부에 액세스하는 기능을 제공합니다.

C API를 사용하는 두 번째 방법은 Python을 C로 작성된 프로그램에 포함시키는 것입니다. C 프로그램은 동적 링크와 마찬가지로 C로 작성된 내장 모듈을 작성하고 C 함수를 노출 할 수 있습니다 도서관 접근법. 또한 API를 사용하면 프로그램에서 스크립트를 실행하여 내장 모듈을 가져 와서 사용할 수 있습니다. 이것은 Python 기반 플러그인 시스템을 만드는 데 사용할 수 있습니다.

"바인딩"은 ctypes를 사용하는 순수 Python 라이브러리 또는 Python/C API를 사용하는 동적 연결 라이브러리로 구현됩니다. 두 번째 옵션은 SWIG과 같은 도구와 함께 사용되어 "보일러 판"코드 생성을 처리하여 작업을 더 쉽게 만들어 주거나 ​​Boost.Python은 Python/C API 위에 C++ API를 제공하므로 C++ 코드와 쉽게 인터페이스 할 수 있습니다.

또한 읽기 : Foreign Function Interface

6

파이썬 (CPython) 인터프리터는 C로 작성되었으며 다른 C 라이브러리를 동적으로 호출 할 수 있으므로 C 확장 모듈이나 포함 된 C 코드는 다른 C 코드에서 쉽게 호출 할 수 있습니다.

CPython은 다른 C 코드를 호출하거나 다른 C 코드에서 호출 할 수 있도록 특수 후크를 허용합니다. 네이티브 코드로 컴파일되고 같은 호출 규칙을 가진 언어 일 필요는 없습니다.

단순한 사례로 mython이라는 프로그램을 만들어 공유 라이브러리를로드하고 함수 run을 호출 할 수 있습니다.

lib = dlopen("mylib.so", RTLD_LAZY); 
func = dlsym(lib, "run"); 
(*func)(); 

그래서 방법으로 당신이 모듈을로드하고 코드라고 한 CPython과는 않습니다하지만 더 복잡한 방법으로, 더 나은 인터페이스와 객체를 제공 주변 통과, 플러스 메모리 관리의 관련된 다른 복잡한은, 스레드 관리가있다

그래서 파이썬 구현 플랫폼은 확장되는 언어와 일치해야합니다. CPython은 Java에서 확장 할 수 없지만 Jython이라는 Python Java 구현은 Java로 확장 될 수 있으며 이와 유사하게 .NET 구현 IronPython은 .Net 언어로 확장 될 수 있습니다.

+2

많은 것들이 C로 작성되었지만 C로 작성된 많은 것들은 C에서 확장 가능하지 않습니다. 파이썬을 특별하게 만드는 것은 무엇입니까? ? –

+0

@Anurag 파이썬이 자바에게 확장 성이 없다는 것이 맞습니까? – ashim

+0

@ IgnacioVazquez-Abrams 편집보기 –

관련 문제