source

Python에서 C를 호출하는 기능

nicesource 2023. 9. 11. 21:52
반응형

Python에서 C를 호출하는 기능

제가 C로 작성한 함수가 많은데 파이썬으로 작성한 코드를 사용하여 해당 함수에 접근할 수 있도록 하고 싶습니다.

비슷한 문제(예를 들어 여기와 여기)를 다루는 질문을 몇 개 읽어 보았지만 어떤 접근 방식을 취해야 하는지 혼란스럽습니다.

한 질문은 ctype을 추천하고 다른 질문은 cyton을 추천합니다.저는 두 사람 모두를 위한 설명서를 조금 읽었는데, 어떤 것이 저에게 더 효과적일지 전혀 모르겠어요.

기본적으로 저는 2차원 FFT를 하기 위해 파이썬 코드를 작성했고 C 코드가 그 결과를 보고 제가 작성한 다양한 C 함수를 통해 처리할 수 있기를 바랍니다.C에서 파이썬으로 전화하는 것이 더 쉬울지 아니면 그 반대가 더 쉬울지 모르겠습니다.

당신은 python에서 actype wrapper를 작성해서 C에게 전화해야 합니다.Cython은 파이썬 같은 코드를 더 빠르게 실행하기 위한 것이고, ctype은 파이썬에서 C 함수를 호출할 수 있도록 하기 위한 것입니다.당신이 해야 할 일은 다음과 같습니다.

  1. 사용하고 싶은 C 함수를 작성합니다. (이미 하셨을 것입니다.)
  2. 이러한 기능에 대해 공유 개체(.so, Linux, os x 등) 또는 동적으로 로드된 라이브러리(.dll, window)를 만듭니다.(아마 당신도 이미 이런 짓을 했을 겁니다.)
  3. ctypes wrapper 작성 (소리보다 쉬워요, 사용법 작성했습니다)
  4. 파이썬의 해당 래퍼에서 함수를 호출합니다. (이것은 다른 파이썬 함수를 호출하는 것과 마찬가지로 간단합니다.)

제가 잘 이해한다면, 당신은 c=> python으로 대화하거나 python => c처럼 대화하는 것을 선호하지 않습니다.e를 추천합니다.Cython하는 것은 조작에 열려 . 특히 당신의 경우 C에서 파이썬으로 작성된 함수를 호출하는 것은 여러 종류의 조작에 상당히 열려 있습니다.

작동 방식()public api은 다음과 같습니다.

( Python Class ( 에서는 합니다 합니다 ) 에서는 self이고, 이 예)및드름에 가)다이a다름가및ss)드(s이ntdd에 method) 이a) 를 하려고 에 를 (, a)를 doubleC 로 부터.이 함수는 a로 작성됩니다.Cython extension당신이 이 전화를 하는 데 도움이 될 겁니다

cdef public api double cy_call_func_double(object self, char* method, bint *error):
    if (hasattr(self, method)):
        error[0] = 0
        return getattr(self, method)();
    else:
        error[0] = 1

그러면 C측에서는 다음과 같이 통화를 수행할 수 있습니다.

PyObject *py_obj = ....
...
if (py_obj) {
    int error;
    double result;
    result = cy_call_func_double(py_obj, (char*)"initSimulation", &error);
    cout << "Do something with the result : " << result << endl;
}

A는 어디에.struct Python/C API를 후해. 그것을 잡은 후.py_obj( 비단뱀 object에서 :, 과 Cython 에서:<PyObject *>my_python_object), 마침내 당신은 전화를 할 수 있을 것입니다.initSimulation (을고를고를다서를다(을서고ahd고ge . ). ( a )double, 하지만 Cython은 쉽게 상대할 수 있습니다 , , ...)

제가 방금 쓴 글이 혼란스러울 수 있다는 것을 알고 있습니다. 만약 당신이 어떤 것을 사용해서 쓴 적이 없다면.Cython, 하지만 이는 합병과 관련하여 여러분을 위해 할 수 있는 수많은 것들을 보여주는 것을 목표로 하고 있습니다.

다른 한편으로, 이 접근 방식은 알고리즘의 복잡성에 따라 파이썬 코드를 C로 레코딩하는 것보다 더 많은 시간이 걸릴 수 있습니다.제 생각에, Cyton을 배우는 데 시간을 투자하는 것은 이런 종류의 욕구를 자주 가질 계획이 있는 경우에만 적절합니다.

이것이 최소한 정보가 됐기를...

자, 아래 두 가지를 말씀하시는 겁니다.

  1. python에서 c 함수를 호출하는 방법(python 확장)
  2. C 프로그램에서 python function/script 호출하는 방법 (Python 내장)

#2의 경우 'Python 내장'입니다.

아래 코드 세그먼트를 사용할 수 있습니다.

#include "python.h"

int main(int argc, char *argv[]) {   
Py_SetProgramName(argv[0]);  /* optional but recommended */   
Py_Initialize();   
PyRun_SimpleString("from time import time,ctime\n"
    "print 'Today is',ctime(time())\n");
/*Or if you want to run python file within from the C code*/       
//pyRun_SimpleFile("Filename");    
Py_Finalize();   
return 0; }

#1의 경우 'Python 확장'입니다. 그렇다면 가장 좋은 방법은 Ctype을 사용하는 것입니다(모든 Python 변형에 걸쳐 btw portable).


>> from ctypes import *

>> libc = cdll.msvcrt

>> print libc.time(None)

>> 1438069008

>> printf = libc.printf

>> printf("Hello, %s\n", "World!")

>> Hello, World!
14

>> printf("%d bottles of beer\n", 42)

>> 42 bottles of beer
19

자세한 안내는 제 블로그 기사를 참고하실 수 있습니다.

파이썬에서 C로 전화하는 것이 더 쉬울 것입니다.당신의 시나리오가 이상하게 들리네요 - 보통 사람들은 C로 쓰여진 프로세서 집약적인 부분을 제외하고 대부분의 코드를 파이썬으로 씁니다.2차원 FFT가 코드에서 계산 집약적인 부분입니까?

여기 디지털 오션에서 제공하는 멋지고 간단한 튜토리얼이 있습니다.짧은 버전:

C 1을 합니다. C 코드 쓰기
당신은 이미 이 일을 했으므로, 아주 짧은 예:

#include <stdio.h>

int addFive(int i) {
    return i + 5;
}

라이브러리 . 공유 라이브러리 파일 만들기
위의 C 파일이 저장되어 있다고 가정하면 다음과 같이 생성됩니다..so python type할을에다서다e을할:onn .cc -fPIC -shared -o c_functions.so c_functions.c

Python의 C 코드를 하세요. Python에서 C 코드를 사용하세요!
modulepython:

# Access your C code
from ctypes import *
so_file = "./c_functions.so"
c_functions = CDLL(so_file)

# Use your C code
c_functions.addFive(10)

그 마지막 줄은 15를 출력할 겁니다.끝났어요!

BLimitless quoting Digital Ocean의 답변은 간단한 경우에는 괜찮지만 int type 인수만 허용하는 것으로 기본 설정됩니다.Float 형식과 같이 입력 인수에 다른 형식이 필요한 경우 다음을 추가해야 합니다.

c_functions.addFive.argtype=[ctype.c_float]

출력 인수를 float 타입으로 변경하는 경우 다음이 필요합니다.

c_functions.addFive.restype=ctype.c_float

언급URL : https://stackoverflow.com/questions/16647186/calling-c-functions-in-python

반응형