2010-09-23 12 views
8

मैं वास्तव में सी ++ के लिए नया हूं और मुझे एक समस्या आई है जो मैं दस्तावेज पढ़कर हल करने में सक्षम नहीं हूं।एक सी ++ एप्लिकेशन में एक स्क्रिप्ट भाषा को एकीकृत करना

मैं अपने सी ++ एप्लिकेशन में एक स्क्रिप्ट भाषा एम्बेड करना चाहता हूं। वह भाषा जावास्क्रिप्ट, लुआ या अधिमानतः पायथन हो सकती है।

मुझे बूस्ट.पथन/स्विग जैसे कुछ की तलाश नहीं है, जो कुछ मेरे सी ++ फ़ंक्शंस/कक्षाओं को एक पायथन इंटरफेस में लपेटने में सक्षम है, बल्कि python_evaluate_and_return_result_as_variable("my_code"); फ़ंक्शन। उदाहरण के लिए

struct my_integers { 
    int a; 
    int b; 
    int c; 
    int d; 
    int e; 
}; 

अब मैं इन पूर्णांकों के साथ कुछ गणित करना चाहते हैं,:

मैं कुछ पूर्णांकों युक्त structs की एक पूरी गुच्छा है

i.a = i.c * i.e; 

गणित मैं क्या करना चाहते हैं भविष्य में बहुत कुछ बदल जाएगा और मुझे अन्य लोगों की ज़रूरत है तो मैं सी ++ कोड तक पहुंच के बिना गणित को बदलने में सक्षम हूं।

मैं इस तरह के कोड संरचना के बारे में सोच रहा हूँ:

  1. मैं अपने struct प्रारंभ और प्रारंभिक मूल्यों
  2. साथ इसे भरने मैं एक बाहरी अजगर समारोह लोड, चलो कहते हैं कि "my_python_function", कि लेता है एक तर्क के रूप में संरचना और इसे वापस करने से पहले इसके साथ गणित करता है।
  3. मैं की तरह i = my_python_function_cppwrapper(i)

मेरी struct कि संभव तरह कुछ है? मैंने इसके लिए बहुत कुछ किया लेकिन मुझे लगता है कि एकमात्र चीज रैपर हैं जो सी ++ -> पायथन (या दूसरी तरफ) कार्यक्षमता प्रदान करते हैं, वास्तव में चर के साथ बातचीत के बिना।

मैं किसी भी मदद के लिए वास्तव में आभारी हूं,
रॉबिन।

+0

Boost.Python क्यों नहीं? यह काम करता है और आपको वही करने देता है जो आप चाहते हैं। – wilx

उत्तर

8

Boost.Python का उपयोग क्यों नहीं करें? आप अपने डेटा वर्गों को पायथन पर बेनकाब कर सकते हैं और वर्णित here के रूप में एक स्क्रिप्ट/फ़ंक्शन निष्पादित कर सकते हैं।

+0

आपको बहुत धन्यवाद, यही वह था जिसे मैं ढूंढ रहा था। जब मैंने Boost.Python पर देखा तो मैंने अनुभाग को याद किया होगा। – Robin

2

V8 जैसे जावास्क्रिप्ट इंजन को एम्बेड करने के बारे में कैसे?

+0

मुझे लगता है कि मैं अजगर के साथ चिपक रहा हूं लेकिन मैं अपनी अगली परियोजना में वी 8 का उपयोग कर सकता हूं। संकेत के लिए धन्यवाद, एकमात्र जावास्क्रिप्ट इंजन जिसे मैं सोच सकता था spidermonkey था। – Robin

6

यदि आप सी/सी ++ से पाइथन स्क्रिप्ट को आसानी से चलाने के लिए चाहते हैं, तो the Python C API का उपयोग करें। अपने सी में/सी ++ कोड:

PyRun_SimpleString("import math; x = math.sqrt(2 * 2)"); 

अधिक जटिल चीजों के लिए, आप एपीआई डॉक्स को देखने के लिए होगा, लेकिन यह बिल्कुल स्पष्ट है।

+0

यह मेरे लिए काफी काम नहीं करता है क्योंकि मुझे चर को पारित करने और निकालने की आवश्यकता है, लेकिन आपकी टिप्पणी के लिए धन्यवाद :) – Robin

8

पायथन दस्तावेज़ में एक सी या सी ++ एप्लिकेशन में embedding Python पर एक पृष्ठ है।

1

एम्बेडेड स्क्रिप्टिंग भाषा के ग्रैंड-डैडी को न भूलें - टीसीएल।

tcl v अच्छा C++ आवरण (boost.python पर मॉडलिंग) कि आह्वान करने के लिए और अपने कोड

1

लुआ, भी बहुत अच्छी तरह से काम करता है विशेष रूप से अपने छोटे के बाद के लिए कॉलबैक के ऊपर तार की यह तुच्छ बनाता है, है ANSI C शिकायत , एक महान विकी और संदेश सूची के साथ कम स्मृति पैर प्रिंट है।यदि आपको और भी गति की आवश्यकता है तो एक x86 32 और 64 बिट जिट संस्करण (लुजाइट) है। बाध्यकारी उपकरण/पुस्तकालयों की एक सरणी के साथ किया जा सकता है, जैसे स्विग या चंद्र (विकी उन्हें सभी सूचीबद्ध करता है)। एकमात्र समस्या जो मैं देख सकता हूं वह स्ट्रक्चर सदस्यों को बाध्य कर रहा है ताकि उन्हें सीधे संदर्भित किया जा सके (यानी: struct.member = 4), हालांकि इसे मेटाटेबल्स के साथ सेट करना संभव है, जो वैरिएबल नामों से बंधे तरीकों को प्राप्त करते हैं और सेट करते हैं

1

आप कहते हैं कि आप अपने सी ++ फ़ंक्शंस/क्लास को पाइथन इंटरफ़ेस में लपेटने के लिए कुछ नहीं ढूंढ रहे हैं, लेकिन यदि आप चाहते हैं कि पाइथन कोड आपके सी ++ my_integers संरचना के सदस्यों को संदर्भित करने में सक्षम हो, तो सी ++ कक्षाओं को लपेटना एक पायथन इंटरफ़ेस। बेशक, आप जितना चाहें उतने या कम वर्गों को लपेटने के लिए स्वतंत्र हैं - इस उदाहरण में, आप my_integers लपेटेंगे, तो my_integers के साथ सामान करने के लिए आप embed a Python interpreter करेंगे।

1

आपके द्वारा वर्णित सरल के लिए कुछ, आप अपनी 'छोटी भाषा' के लिए एक दुभाषिया को लागू कर सकते हैं। आप इसे "रॉबिन" भाषा भी कह सकते हैं। ;-)

1

मैं Lua आंतरिक स्क्रिप्टिंग इंजन के रूप में उपयोग करने की सलाह देता हूं। कार्यान्वयन केवल कुछ पंक्तियां हैं, और हालांकि प्रकाश, भाषा में पर्याप्त शक्ति है। तो टीसीएल की कोई ज़रूरत नहीं है। आप पाइथन को भी देख सकते हैं, सी ++ में एकीकरण आसान है, क्योंकि Boost.Python कार्यान्वयन एकीकरण की सुविधा प्रदान करता है।

लेकिन आवेदन के आधार पर, मैं अभी भी लुआ की सिफारिश करता हूं।

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