2010-01-07 12 views
11

का उपयोग कर बूस्ट पायथन उदाहरणों का निर्माण करना मैं अपने सी ++ कोड में पायथन एक्सटेंशन बनाने के लिए बूस्ट पायथन लाइब्रेरी का उपयोग कर रहा हूं। मैं नीचे दिखाया गया अजगर से आह्वान करने के लिए सी ++ कोड से 'अभिवादन करना' समारोह में सक्षम होना चाहते हैं:विजुअल स्टूडियो 2008

#include <boost/python/module.hpp> 
#include <boost/python/def.hpp> 

char const* greet() 
{ 
    return "hello, world"; 
} 

BOOST_PYTHON_MODULE(hello_ext) 
{ 
    using namespace boost::python; 
    def("greet", greet); 
} 

और अजगर कोड:

import hello_ext 
print hello_ext.greet() 

मैं का उपयोग कर ऐसा करने के लिए प्रबंधित किया है bjam (hello_ext.pyd जेनरेट किया गया है और यह अच्छा काम करता है), लेकिन अब मैं इसे विजुअल स्टूडियो 2008 का उपयोग करके बनाना चाहता हूं। एक hello.dll बनाया जाता है (लेकिन न ही hello_ext.dll और न ही कोई .pyd)। मेरे पायथन कोड का आह्वान करने के बाद मुझे एक त्रुटि मिलती है:

आयात त्रुटि: कोई मॉड्यूल hello_ext नाम नहीं है।

hello.dll hello.pyd या hello_ext.pyd करने का नाम बदलने के बाद, मैं एक और ImportError मिलती है: Dll लोड विफल रही

मैं 2008 वी.एस. का उपयोग कर सही .pyd फ़ाइल का निर्माण कैसे कर सकते हैं?

+0

एक makefile (और जीसीसी) के साथ इस तरह के एक परियोजना के निर्माण में रुचि रखने वालों के लिए संपादित करें, देखें http://stackoverflow.com/questions/2003506/how-to-build-a-boost-dependent-project-using-regular-makefiles/2055958#2055958 – rafak

उत्तर

0

कृपया सुनिश्चित करें कि आपके पास ध्वज -lpython26 है (यदि आप python2.6 का उपयोग कर रहे हैं) और फ़ाइल नाम hello_ext.pyd आपके मामले में होना चाहिए।

10

सबसे पहले, सुनिश्चित करें कि आप केवल पायथन से रिलीज़ संस्करण आयात करने का प्रयास करें; डीबग संस्करण आयात करना विफल हो जाएगा क्योंकि रनटाइम लाइब्रेरी संस्करण मेल नहीं खाते हैं। मैं भी अपने प्रोजेक्ट गुणों को बदलने के लिए इतना है कि रिलीज़ संस्करण एक .pyd फ़ाइल आउटपुट:

गुण >> लिंकर >> आउटपुट:

$(OutDir)\$(ProjectName).pyd 

(मैं भी एक के बाद निर्माण कार्रवाई से इकाई परीक्षण चलाने के लिए बनाने के अजगर)

इसके बाद, सुनिश्चित करें कि आप अपने stdafx.h फ़ाइल में निम्न को परिभाषित करते हैं:

#define BOOST_PYTHON_STATIC_LIB 

अंत में, यदि आप एक से अधिक अजगर संस्करण स्थापित किया है, यकीन है कि तुम मैं कर रहे हैं python.h के सही संस्करण को mporting (उपकरण >> विकल्प >> परियोजनाओं और समाधान >> वीसी ++ निर्देशिकाओं >> फ़ाइलों को शामिल करें)।

5

त्रुटि ImportError: Dll लोड विफल रहा है आमतौर पर मतलब है कि आपके .pyd मॉड्यूल अन्य DLLs कि पाया नहीं जा सका पर निर्भर करता है - अक्सर MSVC * .dll। आप नोटपैड में .pyd फ़ाइल खोलने और ".dll" की खोज करने का प्रयास करना चाह सकते हैं। फिर जांचें कि आपकी निर्देशिका या पीएटीएच में सभी डीएलएल निर्भरताएं मौजूद हैं या नहीं।

या का उपयोग Dependency Walker जिसके लिए याद आ रही निर्भरता मिलेगा आप

1

हालांकि इस एक सवाल कई साल पहले जारी किए गए (अभी भी समाधान नहीं ढूँढ करने के लिए आसान) है, लेकिन मैं आज एक ही समस्या मिलते हैं, और घंटे खोज करने के बाद, अंततः मुझे एक व्यवहार्य समाधान मिला।

  • कारण बस के रूप में सरल है के रूप में जो @AndiDog द्वारा देखा जाता है, .pyd फ़ाइल आप निर्माण पर निर्भर करता है कुछ अन्य .dll;
  • मेरे मामले में, यह boost_python-vc120-mt-1_58 है।dll फ़ोल्डर [सी ++ बढ़ावा फ़ोल्डर] के तहत/चरण/lib/
  • तो, मैं क्या .pyd फ़ाइल फ़ोल्डर के अंतर्गत इस फ़ाइल की प्रतिलिपि है, और यह पेस्ट करने के लिए है, और फिर मेरा अजगर ठीक से कर सकते हैं मैं जिस परियोजना का निर्माण करता हूं उसे आयात करें।

  • शायद कुछ अन्य समाधान हैं, जो आपकी परियोजना का निर्माण गतिशील पुस्तकालय पर निर्भर नहीं है, इसके बजाय स्थैतिक पुस्तकालय का उपयोग करें। कुछ स्रोतों ने वीएस प्रीप्रोसेसर में BOOST_PYTHON_STATIC_LIB को परिभाषित करने के लिए कहा, तो आपकी परियोजना गतिशील लाइब्रेरी (मैं एक नया सी ++ एर) पर निर्भर नहीं रहूंगा, लेकिन सुनिश्चित करें कि आपने libboost_python-vcXXX-mt-1_58.dll बनाया है बूस्ट में

  • प्रीप्रोसेसर परिभाषित करने के लिए, मार्ग है: C/C++ -> Preprocessor-> प्रीप्रोसेसर परिभाषाएं> BOOST_PYTHON_STATIC_LIB
संबंधित मुद्दे