2013-06-06 6 views
15

का उपयोग कर रहा C++ से एक अजगर स्क्रिप्ट कॉल करना चाहते हैं और वापस सी में इस स्क्रिप्ट के द्वारा उत्पन्न उत्पादन csv फ़ाइल का उपयोग करने के ++ कामना करते हैं। मैं मुख्य() में इस की कोशिश की:सी से अजगर स्क्रिप्ट कॉलिंग ++ और इसके उत्पादन

std::string filename = "/home/abc/xyz/script.py"; 
std::string command = "python "; 
command += filename; 
system(command.c_str()); 

यह करता है कॉल और अजगर स्क्रिप्ट को निष्पादित।

अजगर में print आदेशों मार डाला जा रहा है। स्क्रिप्ट कहलाते समय स्क्रीन पर चीजें मुद्रित की जा रही हैं। अब तक सब ठीक है। हालांकि, यह .csv फ़ाइल (उसी स्क्रिप्ट का हिस्सा) नहीं बना रहा है।

उदाहरण: मेरे पास फ़ाइल 100 प्रविष्टियों थी। मैंने पाइथन लिपि को स्क्रिप्ट में थोड़ा बदलाव के साथ बुलाया ताकि training.csv फ़ाइल में अब 100 की बजाय केवल 50 प्रविष्टियां होनी चाहिए। यह अधिलेखित है। हालांकि, ऐसी कोई घटना नहीं हो रही है। स्क्रिप्ट में शेष आदेश (print, आदि) पूरी तरह से काम कर रहे हैं।

training.csv फ़ाइल को सामान्य रूप से fstream और getline का उपयोग करके सी ++ के साथ पढ़ा जाना है।

कोई विचार यह कैसे करना है (लिनक्स का उपयोग करके)?

+0

यह ओएस विशिष्ट है। आपका कौन सा है? – StoryTeller

+3

आप शैल के माध्यम से अजगर दुभाषिया के आह्वान से निपटने के बजाय पायथन को एम्बेड करने (और विस्तारित) के तरीकों को देखना चाह सकते हैं। –

+2

मंच पर निर्भर करता है। विंडोज और यूनिक्स के अलग-अलग दृष्टिकोण हैं। आप किस पर हैं और इसके बारे में पाइथन विशिष्ट नहीं है। – user9876

उत्तर

12

यहाँ अपने सी ++ आवेदन के भीतर से अपने अजगर मॉड्यूल के निष्पादन एम्बेड करने के लिए एक समाधान है। सिस्टम कॉल के माध्यम से आपकी पायथन स्क्रिप्ट को फोर्किंग/निष्पादित करने से बेहतर या खराब नहीं है, यह करने के लिए यह एक अलग तरीका है। चाहे यह सर्वोत्तम है या आपके संदर्भ और उपयोग पर निर्भर नहीं है।

कुछ समय पहले मैंने पाइथन मॉड्यूल को सी ++ एप्लिकेशन में प्लगइन के रूप में लोड करने का एक तरीका कोड किया है, यहां interesting part है।

असल में, आपको अपने पायथन दुभाषिया को शुरू करने के लिए #include <Python.h>, फिर Py_Initialize() की आवश्यकता है।

फिर आप import sys करते हैं, PyRun_SimpleString("import sys"); का उपयोग करके, और आप PyRun_SimpleString('sys.path.append("path/to/my/module/")') कर अपना प्लगइन लोड कर सकते हैं।

सी ++ और पायथन के बीच मूल्यों का आदान-प्रदान करने के लिए, चीजें कठिन हो जाती हैं, आपको अपनी सभी सी ++ ऑब्जेक्ट्स को पाइथन ऑब्जेक्ट्स (मेरी स्क्रिप्ट में लाइन 6 शुरू करना) में बदलना होगा।

तो फिर तुम, PyObject_Call_Object(...) का उपयोग कर अपने समारोह सभी अजगर वस्तुओं आप तर्क के रूप में बनाया का उपयोग कर कॉल कर सकते हैं।

आपको वापसी मूल्य मिलता है, और उन सभी मानों को C++ ऑब्जेक्ट्स में बदल देता है। और उसमें स्मृति प्रबंधन को मत भूलना!

अपने अजगर दुभाषिया, Py_Finalize() के लिए एक सरल कॉल को समाप्त करने।

यह वास्तव में कठिन की तुलना में यह वास्तव में है लगता है, लेकिन आप वास्तव में ऐसा करने में सावधान रहना होगा, क्योंकि यह लीक करने के लिए ले जा सकता है, सुरक्षा के मुद्दों आदि ..

+0

धन्यवाद !!!! लेकिन कहने के लिए wt .... एम kinda beginner ..... सभी सब बहुत बेवकूफ सामान लगता है !!! : ओ: ओ: ओ – learner

5

POSIX के popen()system() के बजाय का उपयोग करें। यह फ़ाइल संभाल लौटने के लिए बाल प्रक्रिया के stdin/stdout पाइप।

FILE* in = popen(command.c_str(), "r"); 

fscanf(in, ... // or some other method of reading 

pclose(in); 
+1

आपका मतलब है 'fscanf', मुझे लगता है :) – StoryTeller

+0

हाँ, सही किया गया। – Vovanium

+0

@ वोवेनियम मदद नहीं कर रहा है :(क्या आप कृपया एक नमूना दिखा सकते हैं ... धन्यवाद! – learner

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