2010-12-27 16 views
5

मैं सी में एक पायथन कक्षा लिख ​​रहा हूं और मैं अपने डीबग कोड में दावा करना चाहता हूं। assert.h मुझे ठीक है। यह केवल डीबग संकलन में डाल दिया जाता है इसलिए पाइथन कोड * के उपयोगकर्ता को प्रभावित करने में असफल विफलता का कोई मौका नहीं है।मैं पायथन सी कोड से कैसे जोर दे सकता हूं?

मैं अपने 'पुस्तकालय' कोड (जो अजगर के खिलाफ जुड़े हुए कोड को अलग होना चाहिए) को विभाजित करने की कोशिश कर रहा हूँ तो मैं अन्य सी कोड से इसका इस्तेमाल कर सकते हैं। मेरे पाइथन विधियां इसलिए मेरे शुद्ध-सी कोड के चारों ओर पतली रैपर हैं। क्योंकि इस अजगर के साथ अपने शुद्ध सी कोड को प्रदूषित करता

if (black == white) 
{ 
    PyErr_SetString(PyExc_RuntimeError, "Remap failed"); 
} 

:

तो मैं अपने 'पुस्तकालय' कोड में ऐसा नहीं कर सकते। यह भी एक सरल

assert(black != white); 

मुझे विश्वास है कि distutils संकलक हमेशा NDEBUG सेट, जिसका मतलब है मैं assert.h उपयोग नहीं कर सकते और भी में डिबग बनाता है की तुलना में कहीं भद्दा है।

मैक ओएस और लिनक्स।

सहायता!

* एक तर्क मैं सी कोड अजगर से कहा जाता है में जोर देते हुए के खिलाफ सुना है।

उत्तर

7

बस assert.h का उपयोग करें। यह एक मिथक है कि distutils हमेशा NDEBUG परिभाषित करता है; यह केवल विंडोज़ पर माइक्रोसॉफ्ट के एमएसवीसी के लिए ऐसा करता है, और उसके बाद केवल एक पायथन रिलीज बिल्ड से शुरू होता है (पायथन डीबग बिल्ड से नहीं)।

फिर अपनी रिलीज बिल्ड में एनडीईबीयूजी को परिभाषित करने के लिए, setup.py build_ext पर -D कमांड लाइन विकल्प पास करें।

संपादित करें: ऐसा लगता है कि एनडीईबीयूजी को पाइथन की मेकफ़ाइल की ओपीटी सेटिंग के माध्यम से डिफ़ॉल्ट रूप से परिभाषित किया गया है। इस रीसेट करने के लिए, अपने setup.py में

OPT="-g -O3" python setup.py build 
+0

है यही कारण है कि मैं क्या सुनना चाहते हैं! इसलिए, जब मैं 'python setup.py build' या' python setup.py build --debug 'चलाता हूं तो मुझे कुछ मिलता है:' gcc-4.2 -fno-hard-aliasing -fno-common -dynamic -arch i386 -arch x86_64 -g -O2 -DNDEBUG -g -O3 -g -UDEBUG -I/लाइब्रेरी/फ्रेमवर्क/पायथन। फ्रेमवर्क/संस्करण/2.7/शामिल/python2.7 -c thing.c -o build/temp.macosx-10.6-intel -2.7/thing.o'। मैं एनडीईबीयूजी को कैसे हटाऊंगा? – Joe

+0

@ जो: मैं देखता हूं; मेरा संपादन देखें। –

+0

यह वास्तव में समस्या का समाधान नहीं करता है। यदि आप सभी मामलों में आवेषण सक्षम करना चाहते हैं तो अपने सभी उपयोगकर्ताओं को कस्टम बिल्ड कमांड का उपयोग करने के लिए यह एक अच्छा समाधान नहीं है।इसे किसी भी तरह से 'setup.py' में एक साफ तरीके से तय करने की आवश्यकता है। – Albert

2

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

2

NDEBUG मैक्रो undefine चलाएँ:

ext_modules = [Extension(
    ... 
    undef_macros=['NDEBUG'], 
)] 

यह (जबकि बदसूरत) सही करता है

gcc ... -DNDEBUG ... -UNDEBUG ... 

कौन सा की तरह एक कमांड लाइन में परिणाम होगा बात, यानी यह दावा रखता है।

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