如何将python字符串的python列表转换为以null结尾的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)
在cdef extern块
中我希望转换('./a.out', 'param1', 'param2')
之类的内容
我可以分配给saferun_task.argv
如何?
答案 0 :(得分:5)
来自Cython文档:
char* PyString_AsString (PyObject *string)
返回字符串内容的以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)
指针stringBuf现在是原始数据的char **而不复制任何字符串 - 尽管您不应该编辑每个字符串中的数据,因为字符串应该被视为const char *(来自docs)。如果你需要操作字符串,你必须记忆数据或制作你不关心Python中的垃圾的新对象 - 尽管你有一个字符串元组我怀疑你是在编辑它们。