2012-03-12 29 views
5

¿Cómo puedo convertir una lista python de cadenas de python en un char** con nulo terminado para que pueda pasarlo a la función C externa?Cython - lista de conversión de cadenas a char **

que tengo:

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) 

en cdef bloque extern

Quiero cambiar algo así como ('./a.out', 'param1', 'param2') a algo que puedo asignar a saferun_task.argv

¿Cómo?

+1

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

+0

Posible duplicado de [Fast string array - Cython] (http://stackoverflow.com/questions/17511309/fast-string-array-cython) – Claudiu

Respuesta

5

De los documentos Cython:

char* PyString_AsString (PyObject *string) 

devuelve una representación terminada en cero de los contenidos de cadena. El puntero se refiere al búfer interno de la cadena, no a una copia. Los datos no se deben modificar de ninguna manera. No debe ser desasignado.

no tengo una configuración Cython compilador y práctico atm (Puedo ejecutar esta tarde y comprobar) pero, esto debería resultado en código que se ve algo como:

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) 

El stringBuf puntero es ahora una char ** a sus datos originales sin copiar ninguna cadena, aunque no debe editar los datos en cada cadena ya que las cadenas deben tratarse como const char * (de docs). Si necesita manipular las cadenas tendrá que memcpy los datos o hacer nuevos objetos que no le importan destrozar en Python, aunque como tiene una tupla de cadenas, dudo que las esté editando.

Cuestiones relacionadas