2012-06-27 21 views
5

मैं एक बड़ी बाइनरी रखना चाहता हूं जो पाइथन दुभाषिया और एक छोटी लिपि को एम्बेड करता है - मैं इस पूरी स्थिर लिंकिंग के लिए बिल्कुल नया हूं, & कॉन्फ़िगर करें और जीसीसी एट अल कॉन्फ़िगर करें। कृपया, क्या कोई मुझे ऐसे निष्पादन योग्य बनाने में बुनियादी कदमों का वर्णन कर सकता है?पायथन एम्बेडिंग

मै मैकोज़ 10.6 पर हूं, मैंने पायथन 3.3 बीटा डाउनलोड किया है। फिर, मैं "test.c" बनाया:

#include <Python.h> 

int 
main(int argc, char *argv[]) 
{ 
    Py_Initialize(); 
    PyRun_SimpleString("from time import time,ctime\n" 
        "print('Today is', ctime(time()))\n"); 
    Py_Finalize(); 
    return 0; 
} 

अब, किसी फ़ोल्डर में, मैं दोनों "अजगर-3.3.0b1" फ़ोल्डर और "test.c" फाइल की है।

मैं टाइप किया:

gcc -I ./Python-3.3.0b1 -o test test.c 

लेकिन मैं "शामिल" त्रुटि के बहुत सारे मिल गया।

लेकिन मुझे यह भी यकीन नहीं है कि यह आगे बढ़ने का सही तरीका है ..? क्या मुझे पहले किसी तरह से सिर्फ पायथन बनाना चाहिए और फिर "test.c" के साथ "लिंक" करना चाहिए?

बीटीडब्लू।, यदि पाइथन रिलीज़ हो जाता है तो क्या वे "./configure" और "मेक" की एक ही प्रक्रिया का उपयोग करते हैं? क्या वे कुछ विशेष विकल्पों का उपयोग करते हैं या क्या मैं python.org से प्रदान किए गए एक के समान पाइथन निष्पादन योग्य (समान) बनाने में सक्षम हूं?

इसके अलावा, मैंने इस "./configure" और "मेक" को आजमाया और यह * build/lib.macosx-10.6-x86_64-3.3 "नामक फ़ोल्डर बना दिया, जिसमें बहुत से * .so फ़ाइलें (?) हैं लेकिन वहां है कुछ भी "पायथन" या इसी तरह कहा जाता है ...?

+0

पथ में हेडर फ़ाइल? –

+0

आप पाइथन के बीटा संस्करण का उपयोग क्यों कर रहे हैं? इसके अलावा, भले ही आप अपने आवेदन में पाइथन को स्थाई रूप से लिंक करते हैं, फिर भी आपको सभी stdlib सामानों की आवश्यकता होगी जो कि अजगर कोड है और इस प्रकार इसे आपकी बाइनरी में आसानी से जोड़ा जा सकता है। – ThiefMaster

+0

मुझे बीटा के बारे में वास्तव में परवाह नहीं है - मैंने अभी पढ़ा है कि एम्बेडिंग तकनीक v2 से v3 में थोड़ा बदल गई है। –

उत्तर

2

क्या आपने py2app का उपयोग करने पर विचार किया है? यदि आप केवल एक स्क्रिप्ट शिपिंग करने में रुचि रखते हैं और सी कोड नहीं लिख रहे हैं, तो यह आपकी आवश्यकताओं को बेहतर तरीके से फिट कर सकता है।

http://svn.pythonmac.org/py2app/py2app/trunk/doc/index.html

+0

धन्यवाद, मुझे py2app के बारे में पता है। मैं जो हासिल करने की कोशिश करता हूं वह यह जानना है कि यह एम्बेडिंग और संकलन कैसे काम करता है, खासकर पायथन के लिए और मैं थोड़ा सी लिखने की कोशिश करना चाहता हूं। –

2

समस्या यह है कि जीसीसी अपने अजगर स्थापना के बारे में पर्याप्त नहीं जानता है और सभी हेडर उचित रूप से लिंक नहीं है। आपको distutils से यह जानकारी प्राप्त करने की आवश्यकता है और यह जानकारी प्राप्त करें कि यह जानकारी जीसीसी में कैसे प्राप्त करें। यह पाइथन दस्तावेज के एम्बेडिंग अनुभाग के Linking Requirements में बेहतर समझाया गया है।

लेकिन एक आसान तरीका है। pymkfile.py नामक एक स्क्रिप्ट है जो make फ़ाइल बनाएगी जिसमें आपको आवश्यक सभी जानकारी शामिल होगी। this tutorial की धारा 4 देखें।

धारा 4 से, एक बहुत तुम क्या करने की कोशिश कर रहे हैं क्या करने के लिए इसी तरह के उदाहरण:

अजगर कोड को एम्बेड की सबसे सरल तकनीक PyRun_SimpleString() फ़ंक्शन का उपयोग करें। यह फ़ंक्शन दुभाषिया को कोड की एक पंक्ति भेजता है। चूंकि दुभाषिया लगातार है, यह एक इंटरैक्टिव पायथन सत्र में अलग-अलग पंक्तियों को टाइप करना है, जिसका अर्थ यह है कि आप कोड की प्रत्येक पंक्ति के साथ PyRun_SimpleString को कॉल करके दुभाषिया को नई लाइनें निष्पादित कर सकते हैं।

#include <Python.h> 
int main() 
{ 
printf("String execution\n"); 
Py_Initialize(); 
PyRun_SimpleString("import string"); 
PyRun_SimpleString("words = string.split('rod jane freddy')"); 
PyRun_SimpleString("print string.join(words,', ')"); 
Py_Finalize(); 
return 0; 
} 

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

$ pymkfile.py pystring > Makefile 

अब, चलाने make वास्तव में कोड के निर्माण के लिए: सबसे पहले, एक उपयुक्त Makefile निर्माण करने के लिए स्क्रिप्ट का उपयोग। बाद अंतिम आवेदन बनाया गया है, परिणाम देखने के लिए एप्लिकेशन को चलाने:

$ ./pystring 

String execution 
rod, jane, freddy 

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

तो, आपने दुभाषिया को कुछ कोड दिया और इसे निष्पादित और मुद्रित किया; नोट करें कि आपको दुभाषिया से आउटपुट लेने की आवश्यकता नहीं है, फिर इसे प्रिंट करें: दुभाषिया ने सीधे मानक आउटपुट पर जानकारी भेजी।

+0

मुझे खेद है, लेकिन मैं काफी अनुवर्ती नहीं हूं। 1.) मेरे पास "पायथन इंस्टॉलेशन" नहीं है - ठीक है, मैकोज़ में पायथन है लेकिन मैं अभी डाउनलोड की गई स्रोत फ़ाइलों का उपयोग करने का प्रयास करता हूं। 2।) "यह एक मुद्दा है जब एप्लिकेशन स्थिर रनटाइम लाइब्रेरी (libpython.a) से जुड़ा होता है और गतिशील एक्सटेंशन लोड करने की आवश्यकता होती है (.so फ़ाइलों के रूप में लागू)।" क्या मुझे * .a या * .so चाहिए? क्या केवल स्रोत फ़ाइलों का उपयोग करना संभव है? क्षमा करें, मैं, यह सब के लिए बहुत नया है। –

+0

आपके पास एक पायथन इंस्टॉलेशन है जो मैकोज़ के साथ शामिल है और आपके सी प्रोग्राम को एम्बेडेड पायथन कोड निष्पादित करने के लिए उस इंस्टॉलेशन में शामिल फ़ाइलों से लिंक करने की आवश्यकता है। चूंकि आप उन फ़ाइलों को जीसीसी नहीं कह रहे हैं, जहां आप लिंकर (शामिल) त्रुटियां प्राप्त करते हैं। स्रोत फ़ाइलों को मैन्युअल रूप से शामिल करना संभव है लेकिन यह गधे में दर्द है। इसके बजाय मैंने जुड़े ट्यूटोरियल से स्क्रिप्ट का उपयोग करें। फिर, अपने पायथन इंस्टॉलेशन में अपने एप्लिकेशन को सही तरीके से लिंक करने के लिए, यह दो सरल कमांड होना चाहिए, 1) './pymkfile.py myCapp> मेकफ़ाइल' जो मेक फ़ाइल बना देगा 2) 'मेक' –

+0

' मेक ': http://www.network-theory.co.uk/docs/gccintro/gccintro_16.html –

1

इसके अलावा, मैं इस "कॉन्फ़िगर" और "बनाने" की कोशिश की और यह फ़ाइलों .so * के बहुत सारे के साथ एक फ़ोल्डर "का निर्माण/lib.macosx-10.6-x86_64-3.3" कहा जाता है बनाया (?) लेकिन "पायथन" या इसी तरह के कुछ भी नहीं है ...?

.so फ़ाइलें ऑब्जेक्ट फ़ाइलें हैं। अजगर निष्पादन योग्य केवल उत्पादन किया जाता है के बाद आप make install फोन है, तो तीन कदम:

अंतिम चरण में आम तौर पर शामिल है
./configure 
make 
make install 

कि sudo

यह सुनिश्चित करें कि आप अपने सिस्टम अजगर की जगह नहीं कर रहे हैं। कोई अच्छा विचार नहीं है।

यदि आप ओएस एक्स पर हैं, तो सामान्य विधि ओएस एक्स पायथन प्रणाली ढांचे से जुड़ना है। यह एम्बेडेड पायथन की तरह 'दिखता है', लेकिन आप मौजूदा सिस्टम पायथन से जुड़ रहे हैं। सिस्टम पायथन लिंक लक्ष्य libpython.dylib/usr/lib

यदि आप एक्सकोड का उपयोग करने के प्रतिकूल नहीं हैं, तो बस Google 'एम्बेडेड पायथन ओएस एक्स' और एक अच्छा ट्यूटोरियल ढूंढें।

मैंने पहली बार THIS ट्यूटोरियल का इस्तेमाल किया था।

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