2014-12-21 9 views
0

나는 C++ 프로젝트를 가지고 있으며 파이썬 API를 제공하고자한다. 사용자가 파이썬 프로젝트에서 가져 오는 공유 라이브러리를 제공한다. C++ 코드는 CLI를 구문 분석하므로 C++ 쪽 (Python-API에서 제공) argv를 char **로 전달해야하며 목록이 아닙니다. 제안 사항이 있으십니까?boost :: python C++에 argv 전달하기

+0

C 배열에'new char * [PyList_Size (l)]'을 할당하고 그 안에'strdup (PyString_AsString (PyList_GetItem (l, I)))'로 생성 된 파이썬 문자열의 C 복사본으로 채울 수 있습니다. 'boost :: python'은 이것을 구현하기위한 단축키를 제공 할 수 있지만, 일반적인 생각입니다. – user4815162342

+0

Tnx man,하지만 Python 용 C-API에 익숙하지 않고 설명을 완전히 이해하지 못했습니다 ... 시간이 있고 작은 코드 예제를 제공 할 수 있다면 정말 멋져요 –

+0

이제는 순수 Python/C API를 사용하여 위의 제안을 구현하는 코드. 'boost :: python' 언어에 쉽게 적응할 수 있어야합니다. 그렇지 않으면 그대로 둘 수 있습니다. – user4815162342

답변

2

다음은 일반적인 Python/C API (테스트되지 않음)를 사용하여 작성된 함수입니다. 적절한 boost::python 구조에 적응 주시기 바랍니다 :

char **list_to_argv_array(PyObject *lst) 
{ 
    assert (PyList_Check(lst));  // use better error handling here 
    size_t cnt = PyList_GET_SIZE(lst); 
    char **ret = new char*[cnt + 1]; 
    for (size_t i = 0; i < cnt; i++) { 
    PyObject *s = PyList_GET_ITEM(lst, i); 
    assert (PyString_Check(s));  // likewise 
    size_t len = PyString_GET_SIZE(s); 
    char *copy = new char[len + 1]; 
    memcpy(copy, PyString_AS_STRING(s), len + 1); 
    ret[i] = copy; 
    } 
    ret[cnt] = NULL; 
    return ret; 
} 

배열이 더 이상 필요하지 않으면 모든 개인 회원뿐만 아니라 배열 자체를 -ing delete[]하여 할당을 해제하지 않습니다.

+0

좋은 답변입니다! TnxAlot –