2012-03-12 20 views
5

Jak mogę przekonwertować listę pythonów na zakończone znakiem Null char**, aby można było przekazać ją do zewnętrznej funkcji C?Cython - konwertująca lista ciągów znaków na char **

mam:

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) 

w cdef extern bloku

chcę przekonwertować coś podobnego ('./a.out', 'param1', 'param2') do czegoś, co można przypisać do saferun_task.argv

Jak?

+1

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

+0

Możliwy duplikat [tablicy ciągów Fast - Cython] (http://stackoverflow.com/questions/17511309/fast-string-array-cython) – Claudiu

Odpowiedz

5

Od docs Cython:

char* PyString_AsString (PyObject *string) 

Zwraca NUL reprezentację treści napisu. Wskaźnik odnosi się do wewnętrznego bufora ciągowego, a nie do kopii. Dane nie mogą być w żaden sposób modyfikowane. Nie można jej anulować.

nie mam setup Cython kompilatora i poręczny ATM (mogę uruchomić to później i sprawdzić), ale powinno to wyniki w kodzie, który wygląda mniej więcej tak:

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) 

Wskaźnik stringBuf jest teraz char ** do oryginalnych danych bez kopiowania żadnych ciągów znaków - nie powinieneś jednak edytować danych w każdym ciągu, ponieważ ciągi powinny być traktowane jako const char * (z dokumentów). Jeśli będziesz musiał manipulować strunami, będziesz musiał zapamiętywać dane lub tworzyć nowe obiekty, których nie obchodzi cię trashing w Pythonie - ale skoro masz krotkę strun, wątpię, żebyś je edytował.

Powiązane problemy