Computer >> 컴퓨터 >  >> 프로그램 작성 >> C 프로그래밍

SWIG를 사용하여 Python용 C/C++ 래핑

<시간/>

Python에서 기존 C 또는 C++ 기능을 래핑하는 방법에는 여러 가지가 있습니다. 이 섹션에서는 SWIG로 C/C++ 기능을 래핑하는 방법을 살펴보겠습니다. 다음은 파이썬에서 c/c++ 기능을 래핑하는 다른 옵션입니다.

  • 수동 포장
  • pyrex를 사용하여 C 코드를 래핑합니다.
  • C유형
  • SIP
  • 파이썬 부스트

SWIG(Simple Wrapper Interface Generator)는 Perl, Python, PHP, Ruby, Tcl, C#, Common Lisp(CLISP, Allegro, CL, UFFI, CFFI), Java, Modula-3 및 OCAML. Swig는 또한 여러 해석 및 컴파일된 Scheme 구현(예:Guile, MzScheme, Chicken)을 지원합니다.

그러나 여기서는 파이썬을 사용한 구현에 대해서만 논의할 것입니다.

SWIG는 기본적으로 C 코드를 이해하고 선택한 언어에 대한 래퍼 코드를 뱉어내는 매크로 언어입니다.

설치

저는 "swigwin-3.0.12" Windows swig 설치 프로그램을 사용하고 있습니다. 다음에서 다운로드할 수 있습니다.

https://www.swig.org/download.html

그 외에도 Windows에서 swig 프로그램을 실행하려면 "Microsoft Visual Studio 14.0" 이상이 필요할 수 있습니다.

swig의 사용을 설명하기 위해 일부 c 함수가 있고 Tcl, Perl, Python(저는 python과 상호 작용 중입니다), Java 및 C#과 같은 다른 언어에 추가하려고 한다고 가정합니다.

내 c 파일은 example.c입니다.

#include "example.h"
int fact(int n) {
   if (n < 0) {       /* This should probably return an error, but this is simpler */
      return 0;
   }
   if (n == 0) {
      return 1;
   } else {
      /* testing for overflow would be a good idea here */
      return n * fact(n-1);
   }
}

인터페이스 파일:

이제 c 파일을 원하는 언어로 추가하려면 SWIG에 대한 입력인 "인터페이스 파일"을 작성해야 합니다. example.c에 대한 내 인터페이스 파일은,

입니다.

예시.i

/* File: example.i */
%module example
%{
   #define SWIG_FILE_WITH_INIT
   #include "example.h"
%}
%include "example.h"

헤더 파일

이전 예제 파일에는 헤더 파일이 포함되어 있습니다. 여기 내 헤더 파일이 있습니다:

예시.h

int fact(int n);

설정 파일:

from distutils.core import setup, Extension
example_module = Extension('_example',
   sources=['example_wrap.c', 'example.c'],
)
setup (name = 'example',
   version = '0.1',
   author = "SWIG Docs",
   description = """Simple swig example from docs""",
   ext_modules = [example_module],
   py_modules = ["example"],
)

래퍼 만들기

이제 인터페이스 파일(example.i)을 사용하여 파이썬 래퍼를 만들 것입니다. 함수에 대한 래퍼를 생성하려면 CLI에서 아래 명령을 실행하기만 하면 됩니다.

>swig -python example.i

이제 현재 작업 디렉토리가 보이면 바로 지금 새 파일이 생성됩니다. 위의 파일 이름을 내 것으로 사용하는 경우 래퍼 파일은 "example_wrap.c"가 됩니다. 그렇지 않으면 래퍼 파일의 이름은

“Your_File_Name” + “_wrapper” + “Your_language_extension”

따라서 예제 파일이 test.c이면 래퍼 파일은 "test_wrapper.c"가 됩니다.

확장 기능 구축

>python setup.py build_ext
running build_ext
building '_example' extension
creating build
creating build\temp.win32-3.6
creating build\temp.win32-3.6\Release
….

이제 C 언어를 파이썬 언어로 래핑할 수 있습니다. 확인하려면 직접 실행하거나 가상 환경을 만들어 별도로 실행할 수 있습니다.

C:\Users\rajesh>mkdir swigExample && cd swigExample
C:\Users\rajesh\swigExample>virtualenv swigenv
Using base prefix 'c:\\python\\python361'
New python executable in C:\Users\rajesh\swigExample\swigenv\Scripts\python.exe
Installing setuptools, pip, wheel...done.

C:\Users\rajesh\swigExample>.\swigenv\Scripts\activate

(swigenv) C:\Users\rajesh\swigExample>python

이제 파일 가져오기 기능에서 실행하고 실행하세요.

>>> from example import fact
>>> fact(6)
720