파이썬에서 C 함수를 사용하는 방법

7794 단어 pythonc
C로 함수를 작성한 다음 Python에서 직접 호출할 수 있다는 것을 알고 계셨습니까? 멋지지 않아? 지금은 모든 배경과 "이 작업을 수행해야 하는 이유"를 건너뛰고 코드를 살펴보겠습니다!

먼저 C 함수



시연하기 위해 C로 숫자의 계승을 찾는 프로그램을 작성할 것입니다. 고등학교 때 팩토리얼이 기억나지 않는다면 다음 예를 들 수 있습니다.

4! (4 계승 읽기) = 4 * 3 * 2 * 1

그것이 우리의 C 프로그램이 할 일입니다. 텍스트 편집기를 실행하고 이 기능을 실행하도록 합니다.

long factorial(int user_input) {
  long return_val = 1;
  if (user_input <= 0) {
    return -1;
  else {
    for (long i = 1; i <= user_input; i++) {
      return_val *= i;
    }
  }
  return return_val;
}

int main() {
  return 0;
}


"long"을 반환하는 "factorial"이라는 함수를 정의하고 있습니다. 계승 함수가 꽤 큰 숫자를 반환할 수 있기 때문에 우리는 int 대신 long을 사용하고 있습니다.

다음으로 계산 값을 반환하는 데 사용할 선언 및 초기화return_val입니다.

이제 if 문은 사용자가 전달한 숫자가 양수인지 확인하고 그렇지 않은 경우 -1 값을 반환합니다. 나중에 Python에서 이 함수를 래핑할 때 C 함수에서 -1을 다시 받는 것은 잘못된 입력이 있음을 의미할 수 있음을 알게 되기 때문에 -1을 반환합니다.

반환된 숫자가 0보다 크면 반복자를 사용하는 루프로 들어가고 i , return_val가 사용자가 전달한 숫자와 같아질 때까지 i 변수에 이를 곱합니다. 기본적으로 이 루프는 다음과 같이 말합니다.n! = 1 * 2 * 3 * 4 ... * nint main()가 있는 마지막 부분은 이것을 .so 파일로 변환할 때 C 컴파일러를 달래는 것입니다. 제가 틀릴 수도 있겠지만, 이 부분은 아무 일도 하지 않아도 꼭 필요한 부분이라고 확신합니다. 더 잘 아시는 분이 계시다면 자유롭게 언급해주시기 바랍니다.

파이썬 이전 부분



이제 C가 작성되었으므로 Python 비트를 작성하기 전에 해야 할 몇 가지 작업이 있습니다. 먼저 .c 파일을 저장합니다. 나는 내 전화 cfactorial.c . 이제 이것을 "공유 객체"파일로 바꿔야 합니다. Linux에서 이를 수행하는 명령은 다음과 같습니다.

$ cc -fPIC -shared -o cfactorial.so cfactorial.c


이 특정 명령은 내 cfactorial.so 파일에서 cfactorial.c를 만듭니다. 이제 실제 파이썬으로

파이썬 부분



거의 완료! 해당 텍스트 편집기를 다시 실행하고 일부 Python을 스크립팅하도록 합니다. 먼저 ctypes 모듈을 가져와야 합니다. 그런 다음 나와 같은 경우 .so 파일의 절대 경로를 자체 변수에 넣고 싶을 것입니다. 따라서 내 pyfactorial.py의 상단은 다음과 같습니다.

from ctypes import *

so_file = '/home/ewhiting/cstuff/cfactorial.so'


다음으로 하고 싶은 일은 이전에 생성한 .so 파일에서 cdll 객체를 생성하는 것입니다. 따라서 so_file 변수 할당 후에 다음을 입력하십시오.

cfactorial = CDLL(so_file)


이제 기술적으로 이 시점에서 명령줄에서 python을 실행하여 Python 스크립트에서 C 함수 호출을 엉망으로 시작할 수 있지만 먼저 약간의 책임을 지도록 하겠습니다. 좀 더 다루기 전에 C 함수를 Python 함수로 래핑하겠습니다. cfactorial 변수를 생성한 후 다음 함수를 생성합니다.

def factorial(num):
  c_return = cfactorial.factorial(num)
  if (c_return != -1):
    return c_return
  else:
    return "C Function failed, check inputs"


이 파일을 pyfactorial.py로 저장합니다. 전체적으로 다음과 같아야 합니다.

from ctypes import *

so_file = '/home/ewhiting/cstuff/cfactorial.so'
cfactorial = CDLL(so_file)

def factorial(num):
  c_return = cfactorial.factorial(num)
  if (c_return != -1):
    return c_return
  else:
    return "C Function failed, check inputs"


가져온 C 공유 객체 파일 내에서 함수를 호출하는 방법은 <CDLL Object>.<function name from C code>(<parameter>) 라고 말하는 것입니다. 쉬운!

따라서 기본적으로 Python 내에서 해당 C 함수를 사용하려고 할 때마다 사용자가 전달한 매개변수로 C 함수를 실행하고 결과를 평가하는 factorial 함수를 호출합니다. C 함수가 -1을 반환하면(여기에 입력했음을 기억하십시오), Python 스크립트는 문제가 있음을 알고 있습니다. 그렇지 않으면 번호를 반환합니다. 그것을 시도하자! 터미널을 실행하고 시작python
>>> import pyfactorial as pf
>>> pf.factorial(5)
120
>>> pf.factorial(10)
3628800
>>> pf.factorial(-4)
'C Function failed, check inputs'


타다!! 이것이 파이썬에서 C 함수를 사용하는 기본 아이디어입니다. 이것은 확실히 가치가 있는 도구입니다. 다른 모든 프로그래머 지식을 적용하여 멋진 기능과 기능을 만들고 질문이 있으면 알려주세요.

좋은 웹페이지 즐겨찾기