2011-09-02 31 views
6

मैं Documentation के अनुसार सी के लिए एंबेडेड अजगर का उपयोग कर समस्या हो रही हूँ - जब भी मैं आयातित मॉड्यूल का उपयोग करके देखें मैं एक:एम्बेडिंग अजगर - आयात करने मॉड्यूल

PythonIncl.exe में 0x1e089e85 पर

क्रिया के अपवाद: 0xC0000005: उल्लंघन उल्लंघन स्थान 0x00000004 का उपयोग करें।

त्रुटि PyObject_GetAttrString() विधि में होती है और दस्तावेज़ीकरण बहुत मदद नहीं करता है। मैंने आईबीएम से Example में ट्यूटोरियल का उपयोग करने का भी प्रयास किया है, लेकिन हमेशा एक ही एक्सेस उल्लंघन प्राप्त होता है।

निम्नलिखित ट्यूटोरियल्स में से एक उदाहरण कोड है जो मुझे काम नहीं कर रहा है, यहां क्या गलत है?

सी-कोड (में एक मुख्य फ़ाइल):

#include <Python.h> 
int main() 
{ 
    PyObject *strret, *mymod, *strfunc, *strargs; 
    char *cstrret; 
    Py_Initialize(); 
    mymod = PyImport_ImportModule("reverse"); 
    strfunc = PyObject_GetAttrString(mymod, "rstring"); 
    strargs = Py_BuildValue("(s)", "Hello World"); 
    strret = PyEval_CallObject(strfunc, strargs); 
    PyArg_Parse(strret, "s", &cstrret); 
    printf("Reversed string: %s\n", cstrret); 
    Py_Finalize(); 
    return 0; 
} 

अजगर कोड (एक फ़ाइल बुलाया reverse.py में, एक ही फ़ोल्डर):

def rstring(s): 
    i = len(s)-1 
    t = '' 
    while(i > -1): 
     t += s[i] 
     i -= 1 
    return t 

मैं का उपयोग कर एक XP मशीन चला रहा हूँ एमएसवीएस 2008, पायथन 2.7

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

+2

क्या आपको पता है कि आपको एक अजगर के शरीर के अंग को इंडेंट करना होगा? – Griwes

+1

पायथन को एम्बेड करने के बजाय पाइथन के लिए एक एक्सटेंशन लिखना लगभग हमेशा अच्छा और अधिक शक्तिशाली है। ऐसा करने से बहुत समान दिखता है, लेकिन विस्तार के लिए बेहतर टूलिंग है और आवश्यकता होने पर अन्य पायथन टूल तक पहुंच बनाना आसान है। बनाम एम्बेडिंग विस्तार पर एक परिप्रेक्ष्य के लिए http://twistedmatrix.com/users/glyph/rant/extendit.html देखें। –

+0

हां, लापता इंडेंट के बारे में, जो पोस्टिंग के दौरान अभी खो गया है, यह आईडीई में है। – Shorkaa

उत्तर

14

PyImport_ImportModule कॉल के परिणाम की जांच करें: यह विफल रहता है और NULL देता है। ऐसा इसलिए है क्योंकि डिफ़ॉल्ट रूप से, वर्तमान निर्देशिका खोज पथ में नहीं है।

PySys_SetPath("."); // before .. 
mymod = PyImport_ImportModule("reverse"); 

मॉड्यूल खोज पथ में वर्तमान निर्देशिका जोड़ने और अपना उदाहरण काम करने के लिए जोड़ें।

+0

'PySys_SetPath ("। ") 'खोज पथ को साफ़/ओवरराइट करता है। आप बेहतर [append] (http://stackoverflow.com/a/8859538/6394138) करेंगे। – Leon

2

आप त्रुटियों की जांच किए बिना आगे बढ़ रहे हैं, इसलिए कोई कोड आपके कोड को विफल नहीं करता है। आपके विवरण से, यह mymodNULL जैसा लगता है, जो एक असफल आयात के अनुरूप होगा। असफल आयात का एक संभावित कारण यह है कि आपके द्वारा पोस्ट किए गए reverse.py में एक वाक्यविन्यास त्रुटि है।

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