2009-05-15 19 views
5

में सी लाइब्रेरी के लिए एक रैपर बनाना मैं एफएलएसी के लिए अपने स्वयं का एक रैपर बनाने की कोशिश कर रहा हूं, ताकि मैं अपने पाइथन कोड में एफएलएसी का उपयोग कर सकूं।पायथन

मैंने पहले ctypes का उपयोग करने की कोशिश की, लेकिन यह लाइब्रेरी में वास्तव में अजीब इंटरफ़ेस दिखाया गया, उदाहरण के लिए एफएलएसी धाराओं और फ़ाइलों के लिए सभी इनिट फ़ंक्शंस एक फ़ंक्शन बन गए हैं, जिसमें इसे प्रारंभ करने के बारे में कोई वास्तविक जानकारी नहीं है। खासकर जब से यह एक स्ट्रीम डिकोडर का संदर्भ चाहता है, लेकिन पायथन के पास पॉइंटर्स (BZZZT!) स्टोर करने का कोई तरीका नहीं है, और इस प्रकार मैं पॉइंटर को स्ट्रीम डिकोडर में स्टोर नहीं कर सकता। यह मदद नहीं करता है कि विभिन्न init कार्यों में तर्कों की एक अलग संख्या है और कुछ तर्क प्रकार भिन्न हैं। इसमें बहुत सारी गणनाएं और संरचनाएं हैं, और मुझे नहीं पता कि इन्हें मेरे कोड में कैसे प्राप्त किया जाए।

मैं पायरेक्स में देख रहा हूं, लेकिन मैं थोड़ी सी पॉइंटर्स के साथ एक ही समस्या में भाग गया, लेकिन मुझे लगता है कि मैंने इसे हल किया है। The file isn't small either, and it's not even complete.

तो मैं विकल्पों, या गाइड की तलाश में हूं जो मुझे उपरोक्त तरीकों को बेहतर तरीके से समझने में मदद करेंगे। अगर मैं सिफारिश और/या मदद प्राप्त कर सकता हूं तो यह वास्तव में मदद करेगा।

उत्तर

5

क्या आप http://www.swig.org/ पर एक नजर है:

बड़ा घूँट एक सॉफ्टवेयर विकास उपकरण उच्च स्तरीय प्रोग्रामिंग भाषाओं की एक किस्म के साथ सी और C++ में लिखे गए प्रोग्राम्स जोड़ता है।

10

अजगर संकेत स्टोर करने के लिए कोई रास्ता नहीं है, और इस तरह मैं धारा विकोडक करने के लिए सूचक संग्रहीत नहीं कर सकता

ctypes संकेत है, और ctypes मौजूदा सी रैप करने के लिए इस्तेमाल किया जा सकता पुस्तकालयों। बस एक टिप, आपको ctypes में सभी relavent सी संरचनाओं को लपेटना/फिर से लिखना होगा। संरचना। उदाहरण देखें: code.google.com/p/pyxlib-ctypes और code.google.com/p/pycairo-ctypes। अधिक जानकारी कैसे समारोह/प्रक्रिया मैप करने के लिए और उसके argtypes और restypehttp://docs.python.org/library/ctypes.html

मैं Pyrex में देख रहा है पर, लेकिन मैं थोड़े संकेत के साथ एक ही समस्या में पड़ गए, लेकिन मुझे लगता है कि मैं इसे हल , की तरह। फ़ाइल या तो छोटी नहीं है, और यह भी पूर्ण नहीं है।

cython हो सकता है कि तुम क्या जरूरत है अगर आप साफ वाक्य रचना चाहते हैं। www.cython.org

तो मैं विकल्पों या मार्गदर्शकों की तलाश में हूं जो मुझे उपरोक्त तरीकों को बेहतर तरीके से समझने में मदद करेंगे। अगर मैं सिफारिश और/या मदद प्राप्त कर सकता हूं तो यह वास्तव में मदद करेगा। दूसरी ओर

बड़ा घूँट हमेशा इस्तेमाल किया जा सकता है, लेकिन यह अधिक जटिल यदि आप इसे करने के लिए इस्तेमाल नहीं कर रहे हैं। www.swig.org

0

कुछ लोग इसके लिए pyrex का उपयोग करते हैं।

+0

साइथन प्रसिद्ध पियरेक्स पर आधारित है, लेकिन अधिक अत्याधुनिक कार्यक्षमता और अनुकूलन का समर्थन करता है। – mtasic85

4

लेकिन पायथन के पॉइंटर्स को स्टोर करने का कोई तरीका नहीं है (BZZZT!)

यह गलत है। आप इस प्रकार का सूचक बनाने के लिए:

pInt = POINTER(c_int)() 

और आप इसे इस

pInt[0] # or p.contents 
2

इस पोस्ट पुरानी है की तरह का उपयोग, लेकिन वहाँ ctypes के लिए एक विकल्प है: CFFI। यह बहुत आसान है, कुछ हद तक तेज़ है, और पीपीपी के तहत बेहतर काम करता है। इसके अलावा, यह पॉइंटर्स के लिए बहुत अच्छा समर्थन है। यहां एक उदाहरण दिया गया है:

from cffi import FFI 

ffi = cffi.FFI() 

ffi.cdef(''' 
struct x { void *a; } 

void* get_buffer(); 
struct x* make_x(void*); 
void change_x(struct x*, void*); 
''') 

dll = ffi.dlopen('libmyawesomelibrary.so') 

buf = dll.get_buffer() 
tst = dll.new('struct x*') 
tst.a = buf 
change_x(tst, get_buffer()) 
tst2 = make_x(get_buffer())