2012-03-12 4 views
5

파이썬 문자열의 파이썬 문자열을 널 종료 char**으로 변환하여 외부 C 함수에 전달할 수 있습니까?Cython - 문자열 목록을 char로 변환 **

나는이 :

struct saferun_task: 
    saferun_jail *jail 
    saferun_limits *limits 

    char **argv 
    int stdin_fd 
    int stdout_fd 
    int stderr_fd 

int saferun_run(saferun_inst *inst, saferun_task *task, saferun_stat *stat) 

은 내가 saferun_task.argv

방법에 할당 할 수있는 뭔가를 ('./a.out', 'param1', 'param2') 뭔가를 변환 할 CDEF 통근 블록에? 사이 썬 워드 프로세서에서

+1

확인 : https://groups.google.com/forum/?fromgroups#!searchin/cython-users/char**/cython-users/ldtOV1QwITA/bxL1AtiALkwJ –

+0

[빠른 문자열 배열 - Cython]의 가능한 복제본 (http://stackoverflow.com/questions/17511309/fast-string-array-cython) – Claudiu

답변

5

:

char* PyString_AsString (PyObject *string) 

문자열의 내용을 null로 끝나는 표현을 돌려줍니다. 포인터는 문자열이 아닌 복사본의 내부 버퍼를 참조합니다. 데이터 은 수정해서는 안됩니다. 할당 취소해서는 안됩니다.

나는 사이 썬 컴파일러 설정하고 편리한 기압이없는 (나중에이를 실행하고 확인할 수 있습니다)하지만,이 같은 보이는 코드의 결과를해야 포인터 stringBuf 이제

from libc.stdlib cimport malloc, free 

cdef char **string_buf = malloc(len(pystr_list) * sizeof(char*)) 

for i in range(len(pystr_list)): 
    string_buf[i] = PyString_AsString(pystr_list[i]) 

# Do stuff with string_buf as a char** 
# ... 

free(string_buf) 

입니다 char **를 임의의 문자열을 복사하지 않고 원본 데이터에 저장합니다. 문자열은 const char * (docs)로 처리해야하므로 각 문자열의 데이터를 편집하면 안됩니다. 문자열을 조작해야 할 경우 데이터를 memcpy하거나 Python에서 삭제하는 것에 신경 쓰지 않는 새 객체를 만들어야합니다. 문자열 튜플을 가지고 있기 때문에 편집하는 것이 의심 스럽지만.

관련 문제