2012-03-12 43 views
5

Làm thế nào tôi có thể chuyển đổi một danh sách python của chuỗi python thành một kết thúc null char** để tôi có thể chuyển nó sang hàm C bên ngoài?Cython - chuyển đổi danh sách các chuỗi thành char **

tôi 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) 

trong CDEF khối extern

Tôi muốn chuyển đổi một cái gì đó giống như ('./a.out', 'param1', 'param2') một cái gì đó mà tôi có thể gán cho saferun_task.argv

như thế nào?

+1

Kiểm tra điều này: https://groups.google.com/forum/?fromgroups#!searchin/cython-users/char**/cython-users/ldtOV1QwITA/bxL1AtiALkwJ –

+0

Bản sao có thể có của [Chuỗi chuỗi nhanh - Cython] (http://stackoverflow.com/questions/17511309/fast-string-array-cython) – Claudiu

Trả lời

5

Từ các tài liệu Cython:

char* PyString_AsString (PyObject *string) 

Trả về một đại diện null-chấm dứt trong những nội dung của chuỗi. Con trỏ đề cập đến bộ đệm bên trong của chuỗi chứ không phải bản sao. Dữ liệu không được sửa đổi theo bất kỳ cách nào. Nó không phải là de-phân bổ.

Tôi không có một thiết lập trình biên dịch Cython và atm tiện dụng (tôi có thể chạy sau này và kiểm tra) nhưng, điều này sẽ dẫn đến mã mà trông giống như sau:

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) 

Các stringBuf con trỏ bây giờ là một là char ** vào dữ liệu ban đầu của bạn mà không cần sao chép bất kỳ chuỗi nào - mặc dù bạn không nên chỉnh sửa dữ liệu trong mỗi chuỗi vì các chuỗi phải được coi là const char * (từ tài liệu). Nếu bạn cần thao tác các chuỗi, bạn sẽ phải ghi nhớ dữ liệu hoặc tạo các đối tượng mới mà bạn không quan tâm đến việc truy tìm bằng Python - mặc dù bạn có một chuỗi các chuỗi mà tôi nghi ngờ bạn đang chỉnh sửa chúng.

Các vấn đề liên quan