2010-12-02 10 views
18

से पाइथन कार्यों को कॉल करना मैं सी ++ से कॉल पायथन कार्यों को प्राप्त करने का प्रयास कर रहा हूं। मैंने सोचा कि इसे फ़ंक्शन पॉइंटर्स के माध्यम से हासिल किया जा सकता है, लेकिन ऐसा प्रतीत नहीं होता है। मैं इसे पूरा करने के लिए boost.python का उपयोग कर रहा हूं।सी ++

कहो एक समारोह अजगर में परिभाषित किया गया है:

def callback(arg1, arg2): 
    #do something 
    return something 

अब मैं इतना है कि यह वहाँ से कहा जा सकता है, सी ++ को यह समारोह पारित करने के लिए की जरूरत है। इसे प्राप्त करने के लिए boost.python का उपयोग करके मैं C++ पक्ष पर कोड कैसे लिखूं?

उत्तर

15

यह किसी भी नाम हो सकता है, तो:

एक समारोह है कि एक boost::python::object लेता है पास यह।

bp::object pycb; //global variable. could also store it in a map, etc 
void register_callback(bp::object cb) 
{ 
     pycb = cb; 
} 

यह एक सुसंगत नाम के साथ एक एकल में जाना जाता है नाम स्थान में है:

bp::object pycb = bp::scope("namespace").attr("callback"); 

bp::objectoperator() परिभाषित किया गया है, ताकि आप इसे बस किसी भी समारोह

ret = pycb() 
+0

Thnks मैथ्यू, मेरे पास एक अतिरिक्त सवाल है। यहां पाइथन ऑब्जेक्ट को उसी धागे से बुलाया जा रहा है। क्या होगा अगर पाइथन ऑब्जेक्ट वैश्विक था और उसे अलग थ्रेड से बुलाया जा रहा था? – Amar

+0

यह संभव है, हालांकि कुछ सवाल इस प्रश्न के दायरे से बाहर है। मैं सी/पायथन एपीआई के PyGILState_ * कार्यों के परिवार की जांच करने की सलाह देता हूं। बूस्ट-पायथन के विपरीत, पायथन के बहुत अच्छे दस्तावेज़ हैं। अगर आपको अभी भी और मदद की ज़रूरत है, तो एक और सवाल पूछें। –

+2

भविष्य के दर्शकों के लिए: किसी ने आखिरकार दूसरे प्रश्न पूछा, और मैंने इसका उत्तर दिया। यहां देखें: stackoverflow.com/questions/8009613/boost-python-not-supporting-parallelism/8011153#8011153 –

4

कोई सुराग नहीं है। लेकिन आपके पास फ़ंक्शन ऑब्जेक्ट होने के बाद इसे कॉल करने के लिए PyObject_Call() का उपयोग कर सकते हैं।

+2

यदि आपके पास 'boost :: पायथन :: ऑब्जेक्ट' है, तो आप इसे कॉल करने के लिए अपने 'ऑपरेटर()' का उपयोग कर सकते हैं। – eudoxos

2

मैंने इसे पहले उपयोग नहीं किया है, लेकिन संदर्भ पुस्तिका में Calling Python Functions and Methods नामक एक अनुभाग है जो यह दिखाता है कि यह कैसे करें।

+1

बूस्ट पायथन दस्तावेज काफी हद तक पुराना है और यहां तक ​​कि बहुत खराब है, जहां तक ​​यह अद्यतित है। –

+0

आह अच्छी तरह से मैंने कोशिश की। :-) – Ken

+0

वह पृष्ठ आपको एक पायथन फ़ंक्शन नहीं दिखाता है। यह आपको दिखाता है कि पहले से बाध्य वस्तु के साथ एक को कैसे कॉल करें। वास्तव में एक "सरल उदाहरण" नहीं है। – CashCow

1

मैं PyRun_SimpleString("myFunction()") इस्तेमाल किया की तरह फोन त्वरित हैक के रूप में, क्योंकि मेरे कार्य का नाम ज्ञात था, कोई तर्क नहीं लिया और __main__ नामस्थान में रहता था। ध्यान दें कि यदि आप बहु-थ्रेडेड हैं तो आपको अतिरिक्त रूप से लॉक जीआईएल प्राप्त करने की आवश्यकता है।