2010-09-06 13 views
9

मैं एक सी ++ एप्लिकेशन में विभिन्न स्क्रिप्टिंग भाषाओं को एम्बेड करने के साथ प्रयोग कर रहा हूं, वर्तमान में मैं स्टैकलेस पायथन 3.1 की कोशिश कर रहा हूं। मैंने कई ट्यूटोरियल और उदाहरणों की कोशिश की है, जो मुझे कुछ मिल सकता है, एप्लिकेशन से एक साधारण स्क्रिप्ट को चलाने और चलाने के लिए।PyRun_SimpleFile पर पाइथन/सी एपीआई क्रैश क्यों करता है?

Py_Initialize(); 

FILE* PythonScriptFile = fopen("Python Scripts/Test.py", "r"); 
if(PythonScriptFile) 
{ 
    PyRun_SimpleFile(PythonScriptFile, "Python Scripts/Test.py"); 
    fclose(PythonScriptFile); 
} 

Py_Finalize(); 

कुछ अजीब कारण के लिए, पर एक पहुँच उल्लंघन में कोड परिणामों के इस टुकड़े चल:

PyRun_SimpleFile(PythonScriptFile, "Python Scripts/Test.py"); 

मैं एक ऐसी ही समस्या के साथ दूसरों के लिए ऑनलाइन खोज की है और केवल एक ही मिल गया है। उनका एकमात्र समाधान एक कामकाज था जो पाइथन के पुराने संस्करण में केवल संभव लगता है: एक पायथन फ़ाइल ऑब्जेक्ट बनाना और FILE* को उस पायथन फ़ाइल ऑब्जेक्ट से PyRun_SimpleFile में वापस करना। इस तरह की फ़ंक्शन कॉल उपलब्ध नहीं हैं, हालांकि, पायथन 3.1 एपीआई फ़ाइल ऑब्जेक्टर्स से फ़ाइल ऑब्जेक्ट बनाता है और फ़ाइल डिस्क्रिप्टर देता है, लेकिन PyRun_SimpleFile फ़ंक्शन को अभी भी FILE* की आवश्यकता होती है।

मुझे फ़ाइल से किसी भी स्क्रिप्ट को चलाने के तरीके के रूप में हानि हो रही है, पूरी फ़ाइल को मैन्युअल रूप से स्मृति में लोड करने और इसे एक विशाल स्ट्रिंग के रूप में चलाने से कम, निश्चित रूप से व्यावहारिक समाधान नहीं है।

क्या देता है? यदि एपीआई में आंतरिक त्रुटि है तो मैं यह कार्य कैसे पूरा कर सकता हूं?

अद्यतन: मैंने स्रोत से स्टैकलेस पायथन 3.1 बनाने में कामयाब रहा है और फिर भी उसी सी रनटाइम लाइब्रेरी का उपयोग करने के बावजूद दुर्घटना पूरी तरह से अपरिवर्तित बनी हुई है। मेरी परियोजना और स्टैकलेस पायथन 3.1 स्रोत दोनों विजुअल स्टूडियो 2010 के सी ++ कंपाइलर और सी रनटाइम के साथ बनाए गए हैं। अब मुझे इस समस्या को हल करने के लिए कोई दिक्कत नहीं है, फ़ाइल नाम का उपयोग करने के लिए पाइथन को संशोधित करने के लिए छोटा और फ़ाइल * नहीं। एक और भयानक कामकाज।

उत्तर

3

यह मेल नहीं खाता एपीआई की समस्या की तरह लगता है। यदि आपका कोड और पायथन रनटाइम अलग-अलग कंपाइलर्स, या यहां तक ​​कि विभिन्न कंपाइलर विकल्पों के साथ संकलित किया गया था, तो FILE * तक पहुंचने से पहुंच उल्लंघन हो सकता है। क्या आप दोबारा जांच सकते हैं कि आपने अपना सी कोड सही तरीके से बनाया है?

आप उल्लेख करते हैं कि आप अपने सी ++ एप्लिकेशन में पायथन एम्बेड कर रहे हैं। ध्यान रखें कि पायथन सी कोड है, जिसे सी कोड के रूप में संकलित किया गया है। शायद यह समस्या का स्रोत है?

+0

ऐ, मैंने अपने स्वयं के स्टैकलेस पायथन 3.1 लाइब्रेरी का निर्माण नहीं किया। मैं पढ़ता हूं कि समस्या विभिन्न रनटाइम से FILE * s का उपयोग बहुत अच्छी तरह से हो सकती है, इस प्रकार वर्कअराउंड क्यों पाइथन लाइब्रेरी को FILE बनाने की अनुमति देना था और इसे फ़ंक्शन के लिए तर्क के रूप में उपयोग के लिए वापस कर देना था। तो फिर, क्या मेरे पास स्रोत प्राप्त करने और स्टैकलेस पायथन 3.1 बनाने के लिए कोई विकल्प नहीं है? –

+0

यदि आप अपना सी कोड बना सकते हैं, तो आपको स्टैकलेस कोड के साथ कोई कठिनाई नहीं होनी चाहिए। –

5

आपका कोड पायथन 2.6 के मेरे स्थापित संस्करण पर सही ढंग से काम करता है। मैंने स्रोत से बेकार 3.1.2 भी बनाया और यह सही ढंग से काम किया। यह उबंटू 10.04 पर जी ++ 4.4.3 के साथ था। यदि आप विंडोज़ पर हैं, तो आप यह जांचना चाहेंगे कि दोनों स्टैकलेस और आपका कोड उसी सी रनटाइम के विरुद्ध बनाया गया है।

+0

ठीक है, वहीं मैं परेशानी में भाग रहा हूं। मुझे पता है कि सी रनटाइम अलग है। मैं विजुअल स्टूडियो 2010 का उपयोग कर रहा हूं और मुझे यकीन है कि अधिकांश पाइथन बाइनरी विजुअल स्टूडियो 2008 के साथ बनाई गई हैं। मैं स्टैकलेस पायथन 3.1 स्रोत बनाने की कोशिश कर रहा हूं, लेकिन मुझे पूरा यकीन नहीं है कि कौन सी लाइब्रेरी, डीएलएल और हेडर की आवश्यकता है। उल्लेख नहीं है कि लापता फाइलों के कारण निर्माण नहीं कर रहे कुछ एक्सटेंशन मॉड्यूल के बारे में कुछ मुद्दे हैं। उन्हें बनाने के लिए प्रदान की गई बैच फ़ाइल कई अन्य गायब फ़ाइलों पर निर्भर करती है, जैसे एसवीएन स्थापित करना। –

+0

@Sion: दुर्भाग्यवश, मैं "दस्तावेज़ों की जांच" और "शुभकामनाएं" कहने के अलावा वास्तव में और कुछ भी नहीं दे सकता हूं। मेरे पास विंडोज़ विकास मशीन तक पहुंच नहीं है, अकेले वीएस -2010 दें। क्या सही दृश्य स्टूडियो संस्करण के साथ बनाया गया स्टडीओ के प्रासंगिक हिस्सों के लिए एक छोटा रैपर लिखने का कोई तरीका है? –

+0

सहायता की सराहना कम नहीं है, हालांकि इस बिंदु पर भी एक ही संकलक और रनटाइम का मुद्दा हल करने पर कोई प्रभाव नहीं पड़ा है। मुझे डेवलपर्स या अन्य पायथन गुरुओं को सीधे कोशिश करने और उससे संपर्क करने की ज़रूरत है। –

12

मैं हो रही थी एक ऐसी ही दुर्घटना & नीचे किया:

PyObject* PyFileObject = PyFile_FromString("test.py", "r"); 
    PyRun_SimpleFileEx(PyFile_AsFile(PyFileObject), "test.py", 1); 

ध्यान दें कि यह 2.7 हालांकि अजगर में था। मुझे नहीं पता कि एपीआई 3.x में बदल गया है या नहीं।

+0

में उपलब्ध नहीं है जैसा कि आपको संदेह है, यह पाइथन 3 के साथ काम नहीं करता है। – MasterMind

9

यह अजगर 3 पर मेरे लिए काम करता है:

PyObject *obj = Py_BuildValue("s", "test.py"); 
FILE *file = _Py_fopen_obj(obj, "r+"); 
if(file != NULL) { 
    PyRun_SimpleFile(file, "test.py"); 
} 

मुझे आशा है कि यह उपयोगी होगा।

+2

मेरे लिए काम करता है, लेकिन छोटे संशोधन के साथ: फ़ाइल * फ़ाइल = _Py_fopen ("test.py", "r +"); PyRun_SimpleFile (फ़ाइल, "test.py"); इसे उत्तर के रूप में चिह्नित किया जाना चाहिए। – MasterMind

+1

@MasterMind: उत्तर का OP स्पष्ट रूप से '_Py_fopen'-function के बजाय' _Py_fopen_obj'-function को कॉल करना चाहता था। मैंने तदनुसार जवाब संपादित किया (इसलिए उत्तर से कोड अब बॉक्स से बाहर काम करना चाहिए)। आपका समाधान हालांकि आसान/अधिक हल्का लगता है। किसी कारण से, दोनों समाधान * केवल * काम करते हैं यदि मैंने 'पीएच_इन्स्टिलाइज()' -फंक्शन के बाद 'कॉन्स्ट char * 'filepath-variable ** घोषित किया था या यदि मैं सीधे आपके जैसा स्ट्रिंग में डालता हूं उदाहरण। (ईमानदार होने के लिए: पायथन सी ++ रैपर दर्द है और यह इतना आसान हो सकता है) – mozzbozz

0

यदि आपने वीसी 2010 के साथ अपना परीक्षण बनाया है, तो आपको निश्चित रूप से समस्याएं मिलेंगी - वीसी 9 (वीएस 2008) और वीसी 10 (वीएस 2010) पर पारस्परिक रूप से असंगत समर्थन डीएलएल हैं जो आमतौर पर आवश्यक हैं (प्रिंटफ, फ़ाइल I/o को लागू करें और उस तरह चीज का)।यदि आप मानक पुस्तकालयों को शामिल करते हैं, जिन्हें पाइथन बिल्ड करता है तो आप उन्हें मिश्रण नहीं कर सकते हैं।

आपके पास हमेशा gcc (उदा। सिगविन या मिंगव) का उपयोग करने या विजुअल स्टूडियो 2008 एक्सप्रेस डाउनलोड करने का विकल्प होता है, जिसे पायथन एम्बेडिंग में प्रयोग के लिए ठीक काम करना चाहिए। मैंने मानक पायथन 2.7.6 बिल्ड दोनों के साथ उपयोग किया है।

0

और क्या इस समाधान के बारे में:

Py_SetProgramName(argv[0]); 
Py_Initialize(); 
PyRun_SimpleString("execfile(\"ex30.py\")"); 
Py_Finalize(); 

कहाँ ex30.py यह अजगर स्क्रिप्ट मैं चला रहा हूँ के नाम।

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

  • कोई संबंधित समस्या नहीं^_^