2012-08-27 10 views
6

मेरे पास एक सी फ़ाइल है जिसमें बिट्स के लिए # डिफाईन्स का समूह है जिसे मैं पायथन से संदर्भित करना चाहता हूं। उनमें से पर्याप्त है कि मैं उन्हें अपने पायथन कोड में कॉपी नहीं करना चाहूंगा, इसके बजाय पाइथन से सीधे संदर्भित करने के लिए एक स्वीकार्य विधि है?मैं पाइथन से सी फ़ाइल में #defines का संदर्भ कैसे दे सकता हूं?

नोट: मुझे पता है कि मैं सिर्फ हेडर फ़ाइल खोल सकता हूं और इसे पार्स कर सकता हूं, यह आसान होगा, लेकिन यदि कोई और पाइथोनिक तरीका है, तो मैं इसका उपयोग करना चाहता हूं।

संपादित करें:

ये बहुत ही सरल #defines कि एक मुखौटा में बिट्स के अर्थ को परिभाषित, उदाहरण के लिए कर रहे हैं:

#define FOO_A 0x3 
#define FOO_B 0x5 
+0

संभव डुप्लिकेट (http://stackoverflow.com/questions/2654329/reliably-converting-c-preproce ssor-मैक्रो-टू-अजगर-कोड) –

+0

मुझे लगता है कि इस http://stackoverflow.com/questions/2654329/reliably-converting-c-preprocessor-macros-to-python-code –

+1

@MattiLyra को डुप्लिकेट है - शायद । लेकिन इस प्रश्न के रूप में वर्तमान में कोई जवाब नहीं है, यह विशेष रूप से सहायक बिंदु नहीं है। –

उत्तर

3

इस धारणा के तहत चल रहा है कि सीएच फ़ाइल में केवल # परिभाषाएं हैं (और इसलिए इसके खिलाफ लिंक करने के लिए बाहरी कुछ नहीं है), तो निम्नलिखित स्विग 2.0 (http://www.swig.org/) के साथ काम करेंगे और पायथन 2.7 (परीक्षण)। मान लीजिए फ़ाइल युक्त बस के रूप में परिभाषित ऊपर just_defines.h नाम है:

#define FOO_A 0x3 
#define FOO_B 0x5 

तब:

swig -python -module just just_defines.h ## generates just_defines.py and just_defines_wrap.c 
gcc -c -fpic just_defines_wrap.c -I/usr/include/python2.7 -I. ## creates just_defines_wrap.o 
gcc -shared just_defines_wrap.o -o _just.so ## create _just.so, goes with just_defines.py 

उपयोग:

$ python 
Python 2.7.3 (default, Aug 1 2012, 05:16:07) 
[GCC 4.6.3] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import just 
>>> dir(just) 
['FOO_A', 'FOO_B', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '_just', '_newclass', '_object', '_swig_getattr', '_swig_property', '_swig_repr', '_swig_setattr', '_swig_setattr_nondynamic'] 
>>> just.FOO_A 
3 
>>> just.FOO_B 
5 
>>> 

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

+0

यह विधि बहुत अच्छा काम किया! मुझे यह तय करने की ज़रूरत है कि क्या इस हेडर के साथ इंटरफेस करने के लिए कुछ सरल सी लिखने का समय उचित है या नहीं। हाथ से सी हेडर को पार्स करने के लिए मुझे बस इतना आसान होना चाहिए। – mfisch

1

#define रों मैक्रो, जो आपके सी के बाहर जो भी कोई अर्थ नहीं हैं कंपाइलर के प्रीप्रोसेसर। इस प्रकार, वे हर जगह बहु भाषा प्रोग्रामर का झुकाव हैं। (उदाहरण के लिए, इस एडीए प्रश्न को देखें: Setting the license for modules in the linux kernel दो हफ्ते पहले)।

सी-प्रीप्रोसेसर के माध्यम से अपना स्रोत कोड चलाने का छोटा, वास्तव में उनके साथ निपटने का कोई अच्छा तरीका नहीं है। मैं आम तौर पर यह समझता हूं कि वे क्या evalutate (जटिल मामलों में, अक्सर वास्तव में संकलित और चलाने के लिए यह करने के लिए कोई बेहतर तरीका नहीं है!), और हार्ड प्रोग्राम जो मेरे कार्यक्रम में मूल्य है।

(अच्छी तरह से) कष्टप्रद हिस्सों में से एक है कि सी प्रीप्रोसेसर को सी कोडर्स द्वारा एक बहुत ही सरल छोटी चीज माना जाता है जिसे वे अक्सर दूसरे विचार के बिना उपयोग करते हैं। नतीजतन, वे चौंक गए कि यह अंतःक्रियाशीलता के लिए बड़ी समस्याएं पैदा करता है, जबकि हम अधिकतर समस्याओं से निपट सकते हैं सी हमें काफी आसानी से फेंकता है।

ऊपर दिखाए गए साधारण मामले में, इसे संभालने का सबसे आसान तरीका कहीं भी आपके पायथन कार्यक्रम में स्थिरांक में समान दो मानों को एन्कोड करना होगा। यदि परिवर्तनों को बनाए रखना एक बड़ा सौदा है, तो शायद फ़ाइल के उन मानों को पार्स करने के लिए पाइथन प्रोग्राम लिखना बहुत मुश्किल नहीं होगा। हालांकि, आपको यह महसूस करना होगा कि आपका सी कोड केवल उन मानों को संकलित पर फिर से मूल्यांकन करेगा, जबकि आपका पायथन प्रोग्राम इसे चलाने पर भी करेगा (और इस प्रकार सी कोड भी संकलित होने पर ही तभी चलाया जाना चाहिए)।

+0

मुझे लगता है कि कई लोगों के लिए आपके द्वारा सुझाए गए सरल तरीके से काम करना होगा, या तो शीर्षलेख को पार्स करना होगा या #defines को एक संपादक में ले जाना होगा और हेडर बदल सकता है, इस पर निर्भर करता है कि यह पाइथन कॉन्स में अनुवाद करने के लिए खोज/प्रतिस्थापन कर रहा है। – mfisch

3

आपके पास पाइथन स्रोत टैरबॉल की Tools/scripts निर्देशिका में h2py.py स्क्रिप्ट के साथ कुछ भाग्य हो सकता है। हालांकि यह जटिल प्रीप्रोसेसर मैक्रोज़ को संभाल नहीं सकता है, यह आपकी आवश्यकताओं के लिए पर्याप्त हो सकता है।

पढ़ें # परिभाषित है और अजगर कोड से अनुवाद करें:

यहाँ स्क्रिप्ट के ऊपर से कार्यक्षमता का वर्णन है। हैंडल # समावेशन बयान। एक तर्क के साथ #define मैक्रो संभाल। कोई भी चीज जो मान्यता प्राप्त नहीं है या वैध अजगर में अनुवाद नहीं करता है नजरअंदाज कर दिया है।

फ़ाइल नाम तर्क के बिना, एक फिल्टर के रूप में कार्य करता है। एक या अधिक फ़ाइल नाम दिया जाता है , तो आउटपुट स्थानीय निर्देशिका में फ़ाइल नाम, सभी अपरकेस में अनूदित इसी, एक्सटेंशन ".py" से बदल के साथ करने के लिए लिखा है।

फार्म "मैं regular_expression" आप अतिरिक्त तार निर्दिष्ट कर सकते हैं में से एक या अधिक विकल्पों में उत्तीर्ण होकर ध्यान नहीं दिया जा करने के लिए। यह उपयोगी है उदा। u_long पर कास्ट अनदेखा करने के लिए: बस "-i '(u_long)' निर्दिष्ट करें।

0

मैं एक अजगर स्क्रिप्ट था लगभग ठीक उसी समस्या से इतना लिखा था का उपयोग करें। यह (लेकिन ज के बजाय .py साथ) अपने ग फ़ाइल मैच के लिए नाम दिया है और एक पायथन मॉड्यूल के रूप में आयात किया जा करने का इरादा है।

कोड: https://gist.github.com/camlee/3bf869a5bf39ac5954fdaabbe6a3f437

उदाहरण:

configuration.h

#define VERBOSE 3 
#define DEBUG 1 
#ifdef DEBUG 
    #define DEBUG_FILE "debug.log" 
#else 
    #define NOT_DEBUGGING 1 
#endif 

अजगर से उपयोग करना:

>>> import configuration 
>>> print("The verbosity level is %s" % configuration.VERBOSE) 
The verbosity level is 3 
>>> configuration.DEBUG_FILE 
'"debug.log"' 
>>> configuration.NOT_DEBUGGING is None 
True 
की [मज़बूती से अजगर कोड के लिए सी पूर्वप्रक्रमक मैक्रो परिवर्तित]
संबंधित मुद्दे

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