2012-03-12 14 views
5

Pythonの文字列のリストをヌルで終わらせたchar**に変換するにはどうすれば外部のC関数に渡すことができますか?Cython - 文字列のリストをcharに変換する

私が持っている:CDEF externをブロック

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') のようなものを変換したいですか? Cythonのドキュメントから

+1

これを確認してください:https://groups.google.com/forum/?fromgroups#!searchin/cython-users/char**/cython-users/ldtOV1QwITA/bxL1AtiALkwJ –

+0

[Fast string array - Cython]の可能な複製(http://stackoverflow.com/questions/17511309/fast-string-array-cython) – Claudiu

答えて

5

char* PyString_AsString (PyObject *string) 

は、文字列の内容のNULL終端さ表現を返します。 ポインタは、文字列の内部バッファを指し、コピーではありません。データ は、決して変更しないでください。割り当てを解除してはいけません。

私はCythonコンパイラの設定と便利な気圧を持っていない(私は後でこれを実行して確認できます)しかし、このようなものに見えるコードで結果べき

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) 

stringBufは今のポインタchar **は文字列をコピーせずにオリジナルのデータに変換します。文字列をconst char *(docsから)として扱う必要があるため、各文字列のデータは編集しないでください。文字列を操作する必要がある場合は、データをmemcpyしなければならないか、またはPythonでのゴミ箱を気にしない新しいオブジェクトを作成しなければなりません。

関連する問題