Cython - 将字符串列表转换为char**

xel*_*lez 6 arrays list cython

如何将python字符串的python列表转换为空终止,char**以便将其传递给外部C函数?

我有:

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)
Run Code Online (Sandbox Code Playgroud)

在cdef extern块中

我希望将类似的内容转换('./a.out', 'param1', 'param2') 为我可以指定的内容saferun_task.argv

怎么样?

Pyr*_*rce 5

从Cython文档:

char* PyString_AsString (PyObject *string)
Run Code Online (Sandbox Code Playgroud)

返回字符串内容的以null结尾的表示形式.指针指的是字符串的内部缓冲区,而不是副本.不得以任何方式修改数据.不得取消分配.

我没有Cython编译器设置和方便的atm(我可以稍后运行并检查)但是,这应该导致代码看起来像:

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)
Run Code Online (Sandbox Code Playgroud)

指针stringBuf现在是原始数据的char**而不复制任何字符串 - 尽管您不应该编辑每个字符串中的数据,因为字符串应该被视为const char*(来自docs).如果你需要操作字符串,你必须记忆数据或制作你不关心在Python中丢弃的新对象 - 尽管你有一个字符串元组我怀疑你是在编辑它们.

  • `PyString_AsString` 仅适用于 python2,因此该解决方案不适用于 python3 (2认同)