2009-06-16 17 views
8

तो मुझे क्या करना (जैसे)पायथन सी एपीआई: अपवाद की स्ट्रिंग प्रस्तुति कैसे प्राप्त करें?

open("/snafu/fnord") 
अजगर में

(और फ़ाइल मौजूद नहीं है), मैं एक ट्रैस बैक और संदेश

IOError: [Errno 2] No such file or directory: '/snafu/fnord' 

मैं पायथन के साथ ऊपर स्ट्रिंग प्राप्त करना चाहते हैं मिल सी एपीआई (यानी, एक सी प्रोग्राम में एम्बेडेड एक पाइथन दुभाषिया)। मुझे इसे स्ट्रिंग के रूप में चाहिए, कंसोल पर आउटपुट नहीं।

PyErr_Fetch() के साथ मैं अपवाद और मान का प्रकार ऑब्जेक्ट प्राप्त कर सकता हूं।

(2, 'No such file or directory', '/snafu/fnord') 

वहाँ जानकारी मैं स्ट्रिंग के लिए अजगर दुभाषिया शो PyErr_Fetch() से प्राप्त से एक आसान तरीका है: ऊपर के उदाहरण के लिए, मान एक टपल है? (एक जो प्रत्येक अपवाद प्रकार के लिए इस तरह के तारों को बनाने में शामिल नहीं है।)

उत्तर

6

मुझे लगता है कि पाइथन अपवाद अपवाद उदाहरण पर "str()" चलाकर मुद्रित होते हैं, जो आपकी रूचि वाली स्वरूपित स्ट्रिंग को वापस कर देगा । में आप PyObject_Str() विधि यहाँ वर्णित फोन करके सी से प्राप्त कर सकते हैं:

https://docs.python.org/c-api/object.html

गुड लक!

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

+0

दूसरा तर्क एक ट्यूपल है और एक स्ट्रिंग नहीं है। और मैं पहले ही PyErr_NormalizeException() को कॉल करता हूं। लेकिन PyErr_Fetch() एक अपवाद ऑब्जेक्ट नहीं देता है, केवल अपवाद प्रकार। इसलिए मुझे अपवाद ऑब्जेक्ट बनाना है, मुझे लगता है? और मैं निर्माता के लिए PyErr_Fetch() का दूसरा तर्क पास करता हूं? – ashcatch

+0

ओह, बस मेरे कोड की जांच की और मैंने सभी मामलों में PyErr_NormalizeException() को कॉल नहीं किया। इसे कॉल करना, वास्तव में दूसरे तर्क को अपवाद ऑब्जेक्ट में बदल देता है। और उसे PyObject_Str() के साथ एक स्ट्रिंग में कनवर्ट करना मुझे वांछित परिणाम प्राप्त करता है। बहुत बहुत धन्यवाद। – ashcatch

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