2012-03-12 11 views
5

मैं पाइथन स्ट्रिंग्स की एक पायथन सूची को शून्य-समाप्त char** में कैसे परिवर्तित कर सकता हूं ताकि मैं इसे बाहरी सी फ़ंक्शन में पास कर सकूं?साइथन - स्ट्रिंग्स को चारों ओर कनवर्ट करने की सूची **

मेरे पास है:

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 निर्वासन ब्लॉक

मैं कुछ करने के लिए ('./a.out', 'param1', 'param2') की तरह कुछ है कि मैं saferun_task.argv

कैसे असाइन कर सकते हैं परिवर्तित करना चाहते हैं?

+1

चेक करें: https://groups.google.com/forum/?fromgroups#!searchin/cython-users/char**/cython-users/ldtOV1QwITA/bxL1AtiALkwJ –

+0

की संभावित डुप्लिकेट [फास्ट स्ट्रिंग सरणी - Cython] (http://stackoverflow.com/questions/17511309/fast-string-array-cython) – Claudiu

उत्तर

5

Cython डॉक्स से:

char* PyString_AsString (PyObject *string) 

स्ट्रिंग की सामग्री का एक अशक्त-समाप्त प्रतिनिधित्व देता है। पॉइंटर स्ट्रिंग के आंतरिक बफर को संदर्भित करता है, न कि प्रतिलिपि। डेटा किसी भी तरह से संशोधित नहीं किया जाना चाहिए। इसे आवंटित नहीं किया जाना चाहिए।

मैं एक Cython संकलक सेटअप और आसान एटीएम की जरूरत नहीं है (मैं इस पर बाद में चलाने के लिए और जांच कर सकते हैं), लेकिन, इस कोड में परिणाम है कि तरह दिखता है चाहिए:

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 ** किसी भी स्ट्रिंग को कॉपी किए बिना आपके मूल डेटा पर - हालांकि आपको प्रत्येक स्ट्रिंग में डेटा संपादित नहीं करना चाहिए क्योंकि तारों को कॉन्स char * (दस्तावेज़ों से) के रूप में माना जाना चाहिए। यदि आपको स्ट्रिंग्स में हेरफेर करने की ज़रूरत है तो आपको डेटा को मिस्की करना होगा या नई ऑब्जेक्ट्स बनाना होगा, जिन्हें आपको पायथन में कचरा करने की परवाह नहीं है - यद्यपि आपके पास स्ट्रिंग्स का टुपल है, मुझे संदेह है कि आप उन्हें संपादित कर रहे हैं।

संबंधित मुद्दे