2011-09-24 24 views
5

में पायथन + numpy कोड एम्बेड करना मैं अजगर एम्बेडिंग का नया हूँ। मैं एक सी ++ कॉलबैक फ़ंक्शन (एक डीएल के अंदर) के अंदर पायथन + numpy कोड एम्बेड करने की कोशिश कर रहा हूंसी ++ डीएल कॉलबैक

जिस समस्या का सामना कर रहा हूं वह निम्नलिखित है। अगर मेरे पास है:

Py_Initialize(); 
// some python glue 
// python invocation 
Py_Finalize(); 

सब कुछ ठीक काम करता है।

लेकिन अगर मेरे पास है:

Py_Initialize(); 
_import_array(); //to initialize numpy C-API 
// some python glue + numpy array object creation 
// python invocation via PyObject_CallObject() 
Py_Finalize(); 

यह दूसरी बार यह _import_array तक पहुँच जाता है पर दुर्घटनाओं(); (जिसका अर्थ है कि यह पहली कॉलबैक के लिए काम करता है)

यदि मैं इसके बजाय केवल एक बार पाइथन और numpy प्रारंभिकता और विनाशक में अंतिम रूप (अंतिम रूप से प्रारंभ/अंतिमकरण नहीं) करता हूं, तो कॉलबैक छोड़ते समय सब कुछ दुर्घटनाग्रस्त हो जाता है ..

समस्या यहाँ मैं अनुमान numpy है, लेकिन मुझे नहीं पता हल करने के लिए कि यह कैसे

+0

आप पूरी तरह से नियंत्रित कर सकते हैं तो कैसे DLL बनाया गया है, मैं peronally distutils और बड़ा घूँट के लिए विवरण छोड़ना होगा:

यहाँ पर "एक DLL में सी ++ सिंगलटन" एक कड़ी है। यहां एक उदाहरण प्रोजेक्ट है (numpy के साथ इंटरफेसिंग): https://github.com/martinxyz/python/tree/master/realistic – maxy

उत्तर

1

सुनिश्चित करें कि आपके .dll केवल परवाह किए बिना कितनी बार कोड वास्तव में शुरू हो जाती है की एक बारआरंभ नहीं हो जाता, बनाने का प्रयास करें।

Singleton in a DLL?

+0

हाय पॉल, आपके उत्तर के लिए धन्यवाद! तो, मुझे पूरा यकीन है कि मेरा डीएल केवल एक बार शुरू हुआ है, और वास्तव में, मैंने यह कहने के लिए छोड़ा है कि अगर मैं अपने डीएल के प्रारंभ में पायथन शुरू करता हूं, और विनाशक में अंतिम रूप देता हूं, तो ऐसा कुछ ठीक काम करता है: ' PyRun_SimpleString (' ' "समय आयात-समय पर, ctime \ n" ' ' "से numpy आयात * \ n" ' ' "प्रिंट ctime 'आज है', (समय()) \ n" '\t ') ; ' लेकिन यदि मैं PyObject_CallObject() के माध्यम से पायथन को कॉल करने का प्रयास करता हूं, तो यह अब और काम नहीं करता है, और जब कॉलबैक –

+1

हाय-1 समाप्त होता है तो यह क्रैश हो जाता है) सुनिश्चित करें कि आप केवल प्रोग्राम निष्पादन के दौरान पायथन शुरू करते हैं (और deinitialize no एक से अधिक बार, अन्यथा कभी नहीं)। 2) ऊपर पोस्ट किए गए martinxyz नमूना कोड को देखें, 3) इस थ्रेड को देखें - एक संदर्भ समस्या के कारण एक समान समस्या: http://www.velocityreviews.com/forums/t566237-pyobject_callobject-code-dump-after -कॉलिंग -4-times.html – paulsm4

+0

धन्यवाद बहुत पॉल, इस लिंक ने बहुत मदद की! वास्तव में समस्या PyTuple_SetItem() द्वारा उपयोग की जाने वाली किसी वस्तु का DECREF था। अब यह काम करता प्रतीत होता है, लेकिन मुझे निश्चित रूप से कुछ और व्यापक परीक्षण करना है! फिर से धन्यवाद! –