2010-01-30 20 views
5

के रूप में उत्पन्न कोड का उपयोग करके मुझे पाइथन में उपयोग के लिए मौजूदा C++ लाइब्रेरी को लपेटने की आवश्यकता है। this answer on choosing an appropriate method to wrap C++ for use in Python के माध्यम से पढ़ने के बाद, मैंने पाई ++ के साथ जाने का फैसला किया।पाय ++ द्वारा पाइथन एक्सटेंशन

मैं tutorial for Py++ के माध्यम से चला गया, ट्यूटोरियल फ़ाइलों का उपयोग कर, और मैं generated.cpp में होने की उम्मीद उत्पादन है, लेकिन मुझे पता लगा नहीं किया है कि क्या वास्तव में आदेश एक विस्तार मैं अजगर में आयात कर सकते हैं के रूप में तैयार किए गए कोड का उपयोग करने में क्या करना । मुझे यकीन है कि मुझे अब कोड संकलित करना है, लेकिन क्या? क्या मुझे bjam का उपयोग करना चाहिए?

+0

आप को देखा है Py ++ के लेखक से यह घोषणा? http://mail.python.org/pipermail/cplusplus-sig/2009-January/014198.html – torial

+0

मेरे पास है, लेकिन यह अभी भी मेरे प्रश्न का उत्तर देने से पहले समाप्त होता है: "अंतिम चरण - कोड उत्पन्न होता है।" मुझे लगता है कि आखिरी कदम उपयोगकर्ता को उस कोड के साथ छोड़ देना चाहिए जो संकलित और आयात योग्य है, न केवल जेनरेट किया गया है। – gotgenes

उत्तर

6

पी ++ आपके एप में पायथन प्रविष्टि बिंदु उत्पन्न करने के लिए बूस्ट :: पायथन के साथ आप सिंटैक्स उत्पन्न करते हैं। मान लीजिए कि पीई ++ के साथ सब कुछ ठीक हो गया है, आपको बूस्ट फ्रेमवर्क डाउनलोड करने की ज़रूरत है, और बूस्ट को अपनी परियोजना में बूस्ट :: पायथन लिब शामिल करें, फिर पी ++ जेनरेट सीपीपी के साथ संकलित करें।

आप अपनी परियोजना के लिए जो भी निर्माण प्रणाली चाहते हैं उसका उपयोग कर सकते हैं, लेकिन बढ़ावा बीजेएम के साथ बनाया गया है। आपको यह चुनने की ज़रूरत है कि आप एक स्थिर lib या गतिशील बूस्ट पायथन lib चाहते हैं, तो here को बढ़ावा देने के लिए निर्देशों का पालन करें।

यदि विंडोज़ पर, आपको अपनी निर्मित लाइब्रेरी पर .dll से.pyd तक एक्सटेंशन को बदलने की आवश्यकता है। और हाँ इसे लाइब्रेरी प्रोजेक्ट होने की आवश्यकता है, यह निष्पादन योग्य के साथ काम नहीं करता है।

फिर, उस पीईडी को रखें जहां आपकी मशीन पर पाइथन इसे पा सकता है और पाइथन में जा सकता है और आयात [आपका-पुस्तकालय-नाम] आयात कर सकता है और उम्मीद है कि सब कुछ काम करेगा।

एक अंतिम ध्यान दें, नाम इस मैक्रो में generated.cpp में दी गई:

BOOST_PYTHON_MODULE(-name-) 

अन्यथा अजगर शिकायत, अपनी परियोजना का सही नाम की जरूरत है।

मैं बस एक महीने पहले यह सब कम कर चुका था इसलिए मुझे भ्रम के बारे में पता है।

लाइब्रेरी और परीक्षण के निर्माण के दौरान मेरे पायथन एक्सटेंशन का उपयोग करना बहुत आसान था, यह मेरे निर्माण पर्यावरण में बूस्ट :: पायथन और पायथन बनाने के लिए था। इस तरह पीईडी ठीक उसी तरह समाप्त होता है जहां मैं इसे चाहता हूं और उपयोगकर्ताओं को मेरे एक्सटेंशन के साथ चलाने के लिए पायथन स्थापित करने की आवश्यकता नहीं है। हालांकि आप जो भी कर रहे हैं उसके लिए यह अधिक हो सकता है।

संपादित करें: यदि आप चाहते हैं कि आपका एक्सटेंशन आसानी से स्थापित और मशीन पर संकलित किया जाए, तो पाइथन के setuptools देखें। केवल कुछ सरल रेखाओं के साथ आप पाइथन संकलन कर सकते हैं और अपने पैकेज को अपने लिए इंस्टॉल कर सकते हैं। हालांकि एक नकारात्मक बात यह है कि यह उन लोगों के लिए आईडीई अनुकूल नहीं है जो दृश्य स्टूडियो में विकास करना पसंद करते हैं।

3

निम्नलिखित उत्तर मुझे Roman Yakovenko on the Python C++-sig mailing list द्वारा प्रदान किया गया था; स्टैक ओवरफ्लो समुदाय के लाभ के लिए, मैं इसे मामूली संपादन के साथ यहां पोस्ट कर रहा हूं।

मैं अभी तक जवाब को पूरी तरह से समझ नहीं पा रहा हूं, लेकिन मुझे लगा कि यह मुझे सही दिशा में इंगित करता है।


कोड उत्पन्न करने के बाद, आपको इसे संकलित करना होगा। इस उद्देश्य के लिए, आप अपने पसंदीदा निर्माण प्रणाली का उपयोग कर सकते हैं। मैं केवल संकलन को संकलित करने के लिए bjam का उपयोग करता हूं। इसके बाद, मैं स्कैन (विंडोज़ और लिनक्स पर) का उपयोग करना पसंद करता हूं।

निम्नलिखित sconstruct फ़ाइल है, जो Py ++ unittests में से एक है (यह भी :-) कोड उत्पन्न होता है) को संकलित करने के लिए किया जाता है का एक उदाहरण है:

import sys 
env = Environment() 

if 'linux' not in sys.platform: 
    env['MSVS'] = {'VERSION': ''} 
    env['MSVS_VERSION'] = '' 
    Tool('msvc')(env) 

t = env.SharedLibrary(
    target=r'abstract_classes', 
    source=[r'/home/roman/language-binding/sources/pyplusplus_dev/unittests/temp/abstract_classes.cpp'], 
    LIBS=[r"boost_python"], 
    LIBPATH=[r"", r"/home/roman/include/libs"], 
    CPPPATH=[ 
     r"/home/roman/boost_svn", 
     r"/usr/include/python2.6", 
     r"/home/roman/language-binding/sources/pyplusplus_dev/unittests/temp", 
     r"/home/roman/language-binding/sources/pyplusplus_dev/unittests/data", 
     r"/home/roman/boost_svn" 
    ], 
    CCFLAGS=[ ], 
    SHLIBPREFIX='', 
    SHLIBSUFFIX='.so' 
) 

के बाद से अपने कोड जनरेटर अजगर में लिखा, तो आप जारी रख सकते हैं जहां Py ++ बंद हो जाता है और आपकी पसंदीदा "मेक" फ़ाइल जेनरेट करता है। आप पिता भी जा सकते हैं। पी ++ परीक्षण कोड उत्पन्न करते हैं, संकलित करते हैं, नए मॉड्यूल को लोड करते हैं और कार्यक्षमता का परीक्षण करते हैं। यह सब एक ही में किया जाता है, अकेले खड़े हो जाओ।

GNUmakefile:

1

मैं निम्नलिखित के साथ एक छोटे makefile लिखा

PYTHON_INC=$(shell python-config --includes) 
PYTHON_LIBS=$(shell python-config --libs) 
BOOST_LIBS=-lboost_python 

all: 
    g++ -W -Wall $(PYTHON_INC) $(PYTHON_LIBS) $(BOOST_LIBS) -fPIC -shared generated.cpp -o hw.so 

और फिर इसे के साथ चारों ओर खेलने के लिए .so IPython में बनाया भरी हुई:

In [1]: import hw 
In [2]: a = hw.animal('zebra') 
In [3]: a.name() 
Out[3]: 'zebra' 
संबंधित मुद्दे