2010-01-12 14 views
12

के फ़ील्ड निकालें मुझे अक्सर अन्य भाषाओं में कोड लिखना पड़ता है जो सी structs के साथ बातचीत करते हैं। आमतौर पर इसमें struct या ctypes मॉड्यूल के साथ पायथन कोड लिखना शामिल है।सी संरचना

तो मेरे पास संरचना परिभाषाओं से भरा एक .h फ़ाइल होगी, और मुझे मैन्युअल रूप से उनके माध्यम से पढ़ना होगा और मेरे पायथन कोड में उन परिभाषाओं को डुप्लिकेट करना होगा। यह समय लेने वाली और त्रुटि-प्रवण है, और जब वे अक्सर बदलते हैं तो दो परिभाषाओं को सिंक में रखना मुश्किल होता है।

क्या किसी भी भाषा में कुछ टूल या लाइब्रेरी है (सी या पायथन नहीं होना चाहिए) जो एक .h फ़ाइल ले सकता है और अपने structs और उनके क्षेत्रों की संरचित सूची तैयार कर सकता है? मैं पाइथन में अपनी संरचना परिभाषाओं को स्वचालित रूप से उत्पन्न करने के लिए एक स्क्रिप्ट लिखने में सक्षम होना पसंद करूंगा, और मैं इसे करने के लिए मनमानी सी कोड को संसाधित नहीं करना चाहता हूं। नियमित अभिव्यक्तियां 90% समय के लिए बहुत अच्छी तरह से काम करती हैं और फिर शेष 10% के लिए अंतहीन सिरदर्द का कारण बनती हैं।

+3

"नियमित अभिव्यक्तियां 90% समय के बारे में बहुत अच्छी तरह से काम करती हैं और फिर शेष 10% के लिए अंतहीन सिरदर्द का कारण बनती हैं।" नियमित अभिव्यक्तियों का एक बहुत अच्छा सारांश है। सिवाय इसके कि मैं अनुपात 50/50 के बारे में बताऊंगा। – captncraig

उत्तर

10

यदि आप डीबगिंग (-g), pahole (git) के साथ अपने सी कोड को संकलित करते हैं तो आपको सटीक संरचना लेआउट का उपयोग किया जा सकता है।

 
$ pahole /bin/dd 
… 
struct option { 
     const char *    name;     /*  0  8 */ 
     int      has_arg;    /*  8  4 */ 

     /* XXX 4 bytes hole, try to pack */ 

     int *      flag;     /* 16  8 */ 
     int      val;     /* 24  4 */ 

     /* size: 32, cachelines: 1, members: 4 */ 
     /* sum members: 24, holes: 1, sum holes: 4 */ 
     /* padding: 4 */ 
     /* last cacheline: 32 bytes */ 
}; 
… 

यह काफी एक बहुत अच्छे सीधे सी

0

इस कार्यों के लिए मेरे एक मित्र ने सी-पार्सर किया जो वह कोग के साथ उपयोग करता था।

3

Swig या SIP पर एक नज़र है कि आप के लिए इंटरफ़ेस कोड उत्पन्न या ctypes का प्रयोग करेंगे है।

5

रेगुलर एक्सप्रेशन से पार्स करने के लिए हो सकता है शेष 10% के लिए समय की महान बारे में 90% काम करते हैं और उसके बाद का कारण होता है अंतहीन सिर दर्द चाहिए।

सिरदर्द उन मामलों में होता है जहां सी कोड में सिंटैक्स होता है जिसे आपने अपने नियमित अभिव्यक्तियों को लिखते समय नहीं सोचा था। फिर आप वापस जाते हैं और महसूस करते हैं कि सी को नियमित अभिव्यक्तियों से वास्तव में पार्स नहीं किया जा सकता है, और जीवन मजेदार नहीं होता है।

इसके चारों ओर करने का प्रयास करें: अपनी खुद की सरल प्रारूप है, जो कम चाल से सी करता है की अनुमति देता है परिभाषित है, और दोनों सी हेडर फाइल और अपनी फ़ाइल से अजगर इंटरफ़ेस कोड बनाएं:

define socketopts 
    int16 port 
    int32 ipv4address 
    int32 flags 

तो फिर तुम कर सकते हैं आसानी से कुछ अजगर लिखने के लिए इस कन्वर्ट करने के लिए:

typedef struct { 
    short port; 
    int ipv4address; 
    int flags; 
} socketopts; 

और भी (, संभवतः उनमें से दो बड़े endian और अन्य देशी-endian आप पर निर्भर) एक अजगर वर्ग जो struct का उपयोग करता है पैक करने के लिए/तीन मानों खोल फेंकना ।

+0

मैं निश्चित रूप से इस पर विचार किया है, लेकिन अक्सर हम किसी अन्य कंपनी है कि हम साथ संवाद करने के लिए एक कस्टम प्रोटोकॉल को लागू करने की जरूरत है से हाथ कोड कर रहे हैं, और के बाद से हम अपने कोड को फिर से लिखने नहीं कर सकते लेकिन उनके हेडर फाइल के लिए उपयोग किया है, इस दृष्टिकोण प्रतिसाद नहीं व्यवहार्य नहीं है हालांकि, अगर मैं सी और पायथन घटक दोनों के साथ खरोंच से सिस्टम को कार्यान्वित कर रहा था, तो मैं निश्चित रूप से ऐसा करूँगा। –

+0

इसके अलावा, मैं सिर्फ देखा है कि मेरी उदाहरण अभी भी बहुत भयानक है, अजगर कोड "बंदरगाह" और "ipv4address" के बीच मंच पर निर्भर गद्दी के लिए खाते में करने की जरूरत है के बाद से। आप शायद संबोधित सकता है "त्रुटि प्रवण" इस योजना होने, मैन्युअल डीएसएल के लिए हेडर का अनुवाद, और फिर कुछ परीक्षण स्वचालित रूप जेनरेट (सी में लिखा है), जो सुनिश्चित करें कि आपके struct और मूल struct, समान हैं विशिष्ट मान लिख कर से दोनों structs के विभिन्न क्षेत्रों में और फिर उन्हें memcmping। फिर पाइथन कोड का उसी तरह से परीक्षण करें। यदि सभी मैच, तो आप अच्छे हैं। –

+1

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

1

मैंने काफी बड़ी परियोजनाओं पर GCCXML का सफलतापूर्वक उपयोग किया है। आपको सी कोड (संरचनाओं सहित) का एक्सएमएल प्रतिनिधित्व मिलता है जिसे आप कुछ सरल पायथन के साथ पोस्ट-प्रोसेस कर सकते हैं।

1

ctypes-codegen या ctypeslib (एक ही बात है, मुझे लगता) ctypes Structure परिभाषाओं उत्पन्न होगा (यह भी अन्य बातों के, मुझे विश्वास है, लेकिन मैं केवल structs की कोशिश की) GCCXML का उपयोग कर हेडर फाइल को पार्स द्वारा। यह अब समर्थित नहीं है, लेकिन कुछ मामलों में काम करेगा।

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