2012-05-18 28 views
7

मैं आदेश मेरा कार्यक्रम में तेजी लाने के लिए निम्नलिखित अजगर समारोह को बदलने के लिए एक सी ++ विस्तार लिखने के लिए कोशिश कर रहा हूँ का उपयोग करपास अजगर सूची बढ़ावा अजगर

अजगर समारोह निम्नलिखित

def calc_dist(fea1, fea2): 
    #fea1 and fea2 are two lists with same length 
    ... 
तरह लग रहा है

#include <vector> 
#include <boost/python.hpp> 
double calc_dist(vector<double>& fea1, vector<double>& fea2) 
{ 
    int len = fea1.size(); 
    double s=0; 
    for(int i=0; i<len;i++){ 
     double p=fea1[i]; 
     double q=fea2[i]; 
     ...//calculating.. 
    } 
    return s; 
} 
BOOST_PYTHON_MODULE(calc_dist) 
{ 
    using namespace boost::python; 
    def("calc_dist",calc_dist); 
} 

और

तरह एक .so फ़ाइल में ऊपर सीपीपी कोड संकलन:

मैं C++ और बढ़ावा अजगर का उपयोग कर इस प्रकार की तरह समारोह लिखा था

g++ calc_dist.cpp -shared -fPIC -o calc_dist.so -I /usr/include/python2.6 -lboost_python 

और एक पायथन कार्यक्रम में .so का उपयोग करने की कोशिश कर रहा है, आयात ठीक काम करता है, यह दर्शाता है कि मॉड्यूल सफलतापूर्वक आयात किया जा सकता है।

तरह

ArgumentError: Python argument types in 
    calc_dist.calc_dist(list, list) 
did not match C++ signature: 
    calc_dist.calc_dist(std::vector<float, std::allocator<float> >, 
         std::vector<float, std::allocator<float> >) 

बहरहाल, जब भी मैं समारोह के लिए पैरामीटर के लिए दो सूचियों गुजरती हैं, अजगर दे देंगे त्रुटियों किसी भी एक मेरी मदद कर सकते हैं कि कैसे इस समस्या को हल करने के लिए? यानी बूस्ट का उपयोग कर सी ++ एक्सटेंशन में एक पायथन सूची पास करते हैं?

बहुत बहुत धन्यवाद!

+1

उपयोग :: अजगर :: सूची देखने के [इस सवाल ] (http://stackoverflow.com/questions/3761391/boostpython-python-list-to-stdvector) –

उत्तर

8

यदि आप पाइथन सूची पर काम करना चाहते हैं तो आप std::vector को स्वीकार करने वाले फ़ंक्शन को क्यों लिखते हैं? वे अलग-अलग चीजें हैं।

बूस्ट। पायथन ने पाइथन सूचियों को list वर्ग के रूप में उजागर किया।

तो, अपने कार्य की तरह

double calc_dist(boost::python::list fea1, boost::python::list fea2) 
{ 
    boost::python::ssize_t len = boost::python::len(fea1); 
    double s=0; 
    for(int i=0; i<len;i++){ 
     double p = boost::python::extract<double>(fea1[i]); 
     double q = boost::python::extract<double>(fea2[i]); 
     ...//calculating.. 
    } 
    return s; 
} 

यह परीक्षण नहीं किया है कुछ दिखना चाहिए, लेकिन उम्मीद है कि काफी निकट आरंभ करने के लिए है ...

बढ़ावा
+0

धन्यवाद, मुझे लगता है कि मुझे बूस्ट पायथन – user1403197

+0

के बारे में और जानना चाहिए, मैंने सिर्फ ऑनलाइन दस्तावेज़ों से उदाहरण को एक साथ रखा है, इसलिए वहां भी होना चाहिए प्रगति करने के लिए आपके लिए पर्याप्त जानकारी हो। – Useless

+0

एक पाइथन सूची से एक स्वचालित रूपांतरण के लिए एक std :: वेक्टर में कोई भी (शायद naively) उम्मीद है, इसमें कोई संदेह नहीं है। यह कोड प्रारंभ करने के लिए पर्याप्त से अधिक है, क्योंकि इसमें एक सही C++ तर्क प्रकार, और आवश्यक निकास शामिल है। धन्यवाद! – ofloveandhate