2012-07-25 6 views
0

MATLAB/MEX를 대체하고 Python으로 전환하려고합니다. 나는 SWIG, ctypes & 가능한 솔루션으로 왔고 (매우 간단하게 보인다) SWIG를 시험해보기 시작했습니다.가변 인수 길이를 읽는 Python C 래퍼

My C 함수의 변수 길이는 main(int argc, char *argv[])입니다. 온라인에서 솔루션을 찾았지만 SWIG와 함께이 문제를 해결하면 많은 문제가 발생합니다.

  1. 다른 방법 (ctypes/Cython)이 더 간단합니까?
  2. SWIG로이 작업을 수행하는 모든 예제가 유용 할 것입니다.

답변

4

정확히 위해 실제로 an example in the SWIG documentation있다 :

#include <stdio.h> 
void test(int n, char *argv[]) 
{ 
    int i; 
    for(i=0;i<n;i++) 
    { 
     printf("%s\n", argv[i]); 
    } 
} 

그런 다음 다음과 같은 파이썬 코드로이 C 함수를 호출 할 수 있습니다 :

먼저 C 코드, 그것은 ARGV의 내용을 변경하지 않아야합니다 이런 종류의 파이썬 함수.

import test 
test.foo(["a", "b", "c"]) 

test 당신이 꿀꺽 꿀꺽 및 준 모듈의 이름입니다

%typemap(in) (int argc, char *argv[]) { 
    int i; 
    if (!PyList_Check($input)) { 
    PyErr_SetString(PyExc_ValueError, "Expecting a list"); 
    return NULL; 
    } 
    $1 = PyList_Size($input); 
    $2 = (char **) malloc(($1+1)*sizeof(char *)); 
    for (i = 0; i < $1; i++) { 
    PyObject *s = PyList_GetItem($input,i); 
    if (!PyString_Check(s)) { 
     free($2); 
     PyErr_SetString(PyExc_ValueError, "List items must be strings"); 
     return NULL; 
    } 
    $2[i] = PyString_AsString(s); 
    } 
    $2[i] = 0; 
} 

%typemap(freearg) (int argc, char *argv[]) { 
    free($2); // If here is uneeded, free(NULL) is legal 
} 

이 간단 할 파이썬을 수행 할 수 있습니다 : 나는 사소한 변화에 여기를 인용했습니다 fooint argc, char *argv[] 서명과 일치하는 함수입니다. 간단하고 직관적 인 Python 프로그래머 용으로 사용하고 복잡한 비트를 캡슐화하고 다시 사용합니다.

%module test 

%include <argcargv.i> 

%apply (int ARGC, char **ARGV) { (int argc, char *argv[]) } 

void foo(int argc, char *argv[]); 

충분 : 문서가 있지만 언급하지 않는 것 무엇


이미 모든이 작업을 수행하는 인터페이스 파일이있을 것입니다.

0

다음은 ctypes를 사용하는 샘플입니다.

from ctypes import * 
dll = cdll.LoadLibrary("charpp_test.dll") 
argv = ["test1", "testtest2", "testtesttest3"] 
dll.test(len(argv), (c_char_p*len(argv))(*argv)) 
+0

감사합니다. 그러나이 .c 파일을 변경하고 파이썬 코드를 사용하면 변경 내용이 반영되지 않습니다. 나는 당신의 코드 끝에 "del dll"을 시도했지만 도움이되지 않는다. 이 DLL을 어떻게 언로드합니까? – SEU