SWIG를 사용한 Python용 C/C++ 패키징 — 세트 1

| | | | | | | | | | |

Numpy, 엄청난 양의 작업 ? 사실 Numpy와 같은 라이브러리는 완전히 Python으로 작성되지 않았으며 라이브러리의 일부는 더 나은 성능을 제공하는 C로 작성되었습니다. C 코드를 작성한 후 Python 코드로 래핑하여 C 코드의 인터페이스 역할을 합니다. 그런 다음 Python 구문을 사용하여 C 함수를 호출할 수 있습니다. 여기서 실제 처리는 C에서 뒤에서 수행되고 결과는 Python 객체로 다시 반환됩니다. 이 기사에서는 SWIG 소프트웨어를 사용하여 Linux 시스템에서 C 프로그램용 Python 래퍼를 만드는 방법을 볼 것입니다.

SWIG란

간단히 말하면 SWIG — C/C++ 선언을 받아들이고 Python, Tcl, Ruby 등과 같은 다른 언어에서 해당 선언에 액세스하도록 랩핑하는 컴파일러입니다.
일반적으로 기존 코드를 변경할 필요가 없으며 인터페이스를 생성합니다. 1분 이내에.

wrapper를 만드는 이유

wrapper가 필요한 경우가 많으며 다음은 —

  • 기존 C 프로그램에 대한 인터프리터 인터페이스 구축.
  • 스크립팅 언어용 고성능 C 모듈 구축
  • 거대한 C 프로그램을 테스트하는 것은 매우 어렵기 때문에 Python과 같은 일부 스크립팅 언어로 래퍼를 작성합니다. 테스트를 작성하는 것은 매우 쉽습니다. etc

SWIG 설치

적절한 저장소에서 SWIG를 직접 다운로드하려면 다음 명령을 입력하십시오. —

sudo apt-get update sudo apt-get install swig 

SWIG를 사용하여 래퍼 작성

자 두 개의 함수와 하나의 전역 변수가 있는 C의 이 코드 —


/ * 파일: gfg.c * /


# 포함 "stdio.h >
# 포함 "수학.h >


// 헤더 파일
# "gfg.h" 포함
# ll long long 정의


double myvar = 3.4;


// 계승 계산

ll int 사실 (ll int n)

{

if (n "= 1)

<코드 클래스 = "키워드 굵게"> 반환 <코드 클래스 = "일반"> 1;

else

반환 (n * 사실 (n-1));

}


// 모드 찾기

int my_mod ( int <코드 클래스 = "일반"> n, <코드 클래스 = "color1 볼드"> int <코드 클래스 = "일반"> m)

< 코드 클래스 = "일반"> {

<코드 클래스 = " 키워드 볼드 "> 반환 <코드 클래스 ="일반 "> (n% m);

}

헤더 파일 — ;


int 사실 ( 코드 클래스 = "color1 볼드"> int <코드 클래스 = "일반"> n);

int my_mod ( int < /코드> <코드 클래스 = "일반"> n, <코드 클래스 = "color1 볼드"> int <코드 클래스 = "일반"> m);

먼저 SWIG 인터페이스 파일 을 만들어야 합니다. 이 파일에는 ANSI C 함수의 프로토타입과 변수 선언이 포함되어 있습니다. 여기 —

  • % module 지시문은 Python에서 사용할 모듈의 이름을 지정합니다.
  • % {. . % }는 생성된 래퍼 코드에 C 헤더 파일 또는 추가 C 선언과 같은 추가 코드를 삽입할 수 있는 위치를 제공합니다.
  • % include 지시문을 사용하면 헤더 파일과 같은 추가 파일을 포함할 수 있습니다.

/ * 파일: gfg.i * /


/ * 사용된 모듈의 이름 * /
% module gfg
% {

/ * 이 파일의 모든 내용은

래퍼 파일. 필요한 C 헤더 파일 포함

인터페이스 컴파일 * /

# "gfg.h" 포함

/ * 변수 선언 * /

이중 myvar;

%}


/ * 함수와 변수를 명시적으로 나열 상호 작용을 위해 * /

double myvar;

long long int 사실 ( long long int n1);

int my_mod ( int <코드 클래스 = "일반"> m, <코드 클래스 = "color1 굵게"> int <코드 클래스 = "일반"> n);


/ * 또는 모든 기능을 연결하려면

다음과 같은 헤더 파일 포함 -

% include & quot; gfg.h & quot;

* /

이제 래퍼 코드를 생성하겠습니다.

$ swig -python gfg.i 

이 명령은 "gfg_wrap.c" 라는 래퍼 코드를 생성합니다. 이 파일에는 다른 오류 처리 코드 등이 포함된 부풀려진 버전의 C 소스가 포함되어 있습니다. 다른 파일 "gfg.py"를 생성했습니다. python 스크립트.


그 후에 "gfg_wrap.c" "gfg를 컴파일하여 공유 라이브러리에서 사용할 위치 독립적인 코드를 생성해야 합니다. .c" 다음 명령을 사용합니다.

$ gcc -c -fpic gfg_wrap.c gfg.c -I / use / include / python2.7 

python2 대체 .7 Python 버전 포함. 이렇게 하면 두 개의 개체 파일
"Gfg_wrap.o‚" "gfg.o‚" 이 생성됩니다. 위의 명령에서 —

  • 대상 시스템에서 지원되는 경우 공유 라이브러리에서 사용하기에 적합한 위치 독립 코드(PIC)를 생성합니다. 이 코드는 GOT(Global Offset Table)를 통해 모든 영구 주소에 액세스합니다.

참고: 다음과 같은 가능한 원인과 같은 오류 메시지가 표시되는 경우 —

  • ' 파이썬.h ' 또는
  • ' 파이썬.h ' 컴파일러용

' 파이썬.h ' 다음 명령을 사용하여 Python-dev, 를 설치해야 합니다. —

$ sudo apt-get install python-dev 

Python.h에 대한 올바른 경로를 찾으려면 다음 명령을 실행하십시오. —

$ python -config --cflags 

다음과 같이 출력됩니다. —

이제 python2.7의 경우 컴파일 명령의 경로를 이 경로로 바꾸거나 Python 3.5의 경우 버전을 python3.5 로 변경합니다. .

이제 마지막으로 생성된 개체 파일을 함께 연결하여 Windows의 DLL 파일과 유사한 공유 개체를 생성해야 합니다. 다음 명령을 사용하면 공유 개체 파일 "_gfg.so"

$ gcc -shared gfg.o gfg_wrap.o -o _gfg.so가 생성됩니다. 

이제 Python 셸을 가져와 테스트할 준비가 되었습니다. 이 쉘 파일이 있는 디렉토리에 있는지 확인하십시오.

> > > 가져오기 gfg > > > res = 사실(5) > > > 해상도 120 > > > res = my_mod(5,2) > > > 해상도 1 > > > gfg.cvar.myvar 3.4 

여기서 C 변수는 다음과 같이 사용할 수 있습니다.

distutils를 사용한 컴파일 및 연결

< / p>

명령을 입력하고 파일을 컴파일하는 데 필요한 컴파일 옵션을 파악하는 대신 distutils를 사용하여 이를 자동화할 수 있습니다. 아래와 같이 생성합니다.


# 파일: setup.py


distutils.core 가져오기 설정, 확장

# 모듈 이름

이름 = "gfg"


# 모듈 버전

버전 = "1.0"


# 확장 이름 및 소스 파일 지정
# 컴파일에 필요

ext_modules < 코드 클래스 s = "keyword"> = 확장자(이름 = <코드 클래스 = "문자열"> ’_gfg’ <코드 클래스 = "일반">, 소스 <코드 클래스 = "키워드"> = <코드 클래스 = "일반"> [ <코드 클래스 = "문자열 ">" gfg.i " <코드 클래스 ="일반 ">, <코드 클래스 ="string ">" gfg.c " ] )


설정(이름 = 이름,

버전 = 버전,

<코드 클래스 = "일반"> ext_modules <코드 클래스 = "키워드"> = <코드 클래스 = "일반"> [ext_modules])

이제 다음 명령을 작성하여 모듈 —

$ python setup.py build_ext --inplace 

이는 다음과 같아야 합니다. 터미널에서 이와 같은 것 —

가능한 대안

물론 SWIG — 래퍼를 만드는 유일한 방법은 아니지만 요구 사항에 따라 다음 대안을 고려할 수 있습니다.

다음에서 기사에서는 C++(OPP) 코드

링크

이 기사는 Atul Kumar . Python.Engineering으로서 기여하고 싶다면 Contribute.python.engineering 을 사용하거나 기사를 게시하여 기사를 작성할 수도 있습니다. Contribute @ python.engineering.Python.Engineering 홈페이지에 나오는 내 기사를 참조하고 다른 괴짜들을 도와주세요.

잘못된 점을 발견하거나 논의된 주제에 대해 더 많은 정보를 공유하고 싶은 경우 의견을 게시하세요. 위.

Shop

Learn programming in R: courses

$

Best Python online courses for 2022

$

Best laptop for Fortnite

$

Best laptop for Excel

$

Best laptop for Solidworks

$

Best laptop for Roblox

$

Best computer for crypto mining

$

Best laptop for Sims 4

$

Latest questions

NUMPYNUMPY

psycopg2: insert multiple rows with one query

12 answers

NUMPYNUMPY

How to convert Nonetype to int or string?

12 answers

NUMPYNUMPY

How to specify multiple return types using type-hints

12 answers

NUMPYNUMPY

Javascript Error: IPython is not defined in JupyterLab

12 answers


Wiki

Python OpenCV | cv2.putText () method

numpy.arctan2 () in Python

Python | os.path.realpath () method

Python OpenCV | cv2.circle () method

Python OpenCV cv2.cvtColor () method

Python - Move item to the end of the list

time.perf_counter () function in Python

Check if one list is a subset of another in Python

Python os.path.join () method