से पाइथन ट्रेसबैक तक पहुंचने में मुझे सी एपीआई का उपयोग करके पाइथन ट्रेसबैक चलने का उचित तरीका पता लगाने में कुछ परेशानी हो रही है। मैं एक ऐसा एप्लीकेशन लिख रहा हूं जो पायथन दुभाषिया को एम्बेड करता है। मैं मनमाने ढंग से पायथन कोड निष्पादित करने में सक्षम होना चाहता हूं, और यदि यह अपवाद उठाता है, तो इसे अपने स्वयं के एप्लिकेशन-विशिष्ट C++ अपवाद में अनुवादित करने के लिए। अभी के लिए, केवल फ़ाइल नाम और लाइन नंबर निकालने के लिए पर्याप्त है जहां पायथन अपवाद उठाया गया था।सी एपीआई
PyObject* pyresult = PyObject_CallObject(someCallablePythonObject, someArgs);
if (!pyresult)
{
PyObject* excType, *excValue, *excTraceback;
PyErr_Fetch(&excType, &excValue, &excTraceback);
PyErr_NormalizeException(&excType, &excValue, &excTraceback);
PyTracebackObject* traceback = (PyTracebackObject*)traceback;
// Advance to the last frame (python puts the most-recent call at the end)
while (traceback->tb_next != NULL)
traceback = traceback->tb_next;
// At this point I have access to the line number via traceback->tb_lineno,
// but where do I get the file name from?
// ...
}
अजगर स्रोत कोड में चारों ओर खुदाई, मैं वे _frame
संरचना, जो लग रहा है के माध्यम से वर्तमान फ्रेम के दोनों फ़ाइल नाम और मॉड्यूल का नाम का उपयोग को देखने जैसे कि यह एक privately- है: यह क्या मैं अब तक किया है परिभाषित संरचना। मेरा अगला विचार प्रोग्रामिक रूप से पायथन 'ट्रेसबैक' मॉड्यूल लोड करना था और सी एपीआई के साथ अपने कार्यों को कॉल करना था। क्या यह साईं है? क्या सी से पाइथन ट्रेसबैक तक पहुंचने का कोई बेहतर तरीका है?
[PyErr_Fetch] (https://docs.python.org/2/c-api/exceptions.html#c.PyErr_Fetch) स्मृति रिसाव का उत्पादन (पर निर्भर करता है कार्यान्वयन यह महत्वपूर्ण हो सकता है) – alex
"PyTracebackObject * traceback = (PyTracebackObject *) ट्रेसबैक का उद्देश्य क्या है;"? मुझे लगता है कि आपका मतलब है "PyTracebackObject * traceback = (PyTracebackObject *) excTraceback;"। – aquirdturtle