साइथन का उपयोग करके मुख्य पायथन कार्यक्रम संकलित करें


81

मेरे पास Python2.6 प्रोग्राम है जो Cython का उपयोग करके .so फ़ाइलों के लिए संकलित Python मॉड्यूल को लोड कर सकता है। मैंने .so फ़ाइलों के लिए .py मॉड्यूल को संकलित करने के लिए साइथॉन का उपयोग किया और सब कुछ ठीक काम करता है।

यह सेटअप थ्योरी फ़ाइल है जिसका मैं साइथन के साथ उपयोग करता हूं:

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext

ext_modules = [
    Extension("ldap", ["ldap.pyx"]),
    Extension("checker", ["checker.pyx"]),
    Extension("finder", ["finder.pyx"]),
    Extension("utils", ["utils.pyx"]),
]

setup(
  name = 'bchecker',
  cmdclass = {'build_ext': build_ext},
  ext_modules = ext_modules
)

इसलिए मुझे पता है कि मैं साइथॉन का उपयोग करके पायथन मॉड्यूल संकलित कर सकता हूं (मुझे लगता है कि साइथन मेरी पायथन फाइलों से 'सी' फाइलें बनाता है और फिर उन्हें संकलित करता है), लेकिन क्या मैं अपने मुख्य पायथन प्रोग्राम को किसी लिनक्स प्लेटफॉर्म पर निष्पादित कर सकता हूं? यदि हां, तो साइथॉन कमांड लाइन उदाहरण की सराहना की जाएगी। धन्यवाद।


4
क्या इनमें से कोई उत्तर उपयोगी था? क्या आपको यह काम मिला? यदि हां, तो कृपया एक उत्तर स्वीकार करें
माइक पेनिंगटन

3
मुझे संदेह है कि यह कभी भी चिह्नित किया जाएगा - उपयोगकर्ता को प्रश्न की संपादित तिथि के एक दिन बाद आखिरी बार देखा गया था।
टूटा हुआ आदमी

जवाबों:


152

एडम मटन और अन्य लोगों के दावे के विपरीत, आप वास्तव में साइथन का उपयोग करके एक एकल निष्पादन योग्य बाइनरी फ़ाइल बना सकते हैं , शुद्ध पायथन (.py) फ़ाइल से।

हां, साइथन का उपयोग करने के लिए कहा गया है - CPython अजगर रनटाइम के लिए लेखन C / C ++ एक्सटेंशन मॉड्यूल को सरल बनाने के तरीके के रूप में।

लेकिन, इस टिप्पणी में nudzo के रूप में , आप --embedकमांड लाइन प्रॉम्प्ट पर स्विच का उपयोग कर सकते हैं ।

यहाँ एक अत्यंत सरल उदाहरण है। मैं python3 और cython3 का उपयोग करते हुए एक डेबियन सिड वर्कस्टेशन से इसे सुधार रहा हूं।

सुनिश्चित करें कि आपके पास पहले से स्थापित अजगर-देव या अजगर -देव पैकेज हैं।

1) एक बहुत ही सरल पायथन प्रोग्राम बनाएं जिसका नाम है hello.py

$ बिल्ली hello.py

प्रिंट ("हैलो वर्ल्ड!")

2) C में अपने अजगर कार्यक्रम को संकलित करने के लिए साइथन का उपयोग करें ...

cython3 --embed -o hello.c hello.py

3) हैलो नामक एक निष्पादन योग्य फ़ाइल में hello.c संकलित करने के लिए GCC का उपयोग करें ...

gcc -Os -I /usr/include/python3.3m -o hello hello.c -lpython3.3m -lpthread -lm -lutil -ldl

4) आप हैलो नामक एक फ़ाइल के साथ समाप्त ...

$ फ़ाइल हैलो

हैलो: जीएनयू / लिनक्स 2.6.32, बिल्डआईडी [sha1] = 006f455a5a26f1949c6ed051df9cbd4433e1ac23 के लिए ELF 64-बिट LSB निष्पादन योग्य, x86-64, संस्करण 1 (SYSV), गतिशील रूप से जुड़ा हुआ (साझा उपयोग का उपयोग करता है), नहीं छीन लिया गया।

$ ldd hello
linux-vdso.so.1 (0x00007fff273fe000)
libpython3.3m.so.1.0 => /usr/lib/x86_64-linux-gnu/libpython3.3m.so.1.0 (0x00007fc61dc2c000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fc61da0f000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fc61d70b000)
libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00007fc61d508000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fc61d304000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fc61cf5a000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fc61cd52000)
libexpat.so.1 => /lib/x86_64-linux-gnu/libexpat.so.1 (0x00007fc61cb28000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007fc61c90f000)
/lib64/ld-linux-x86-64.so.2 (0x00007fc61e280000)

इस मामले में, निष्पादन योग्य गतिशील रूप से मेरे डेबियन सिस्टम पर पायथन 3.3 से जुड़ा हुआ है।

5) चलाने हैलो ...

$

नमस्ते दुनिया!

जैसा कि आप देख सकते हैं, इस पद्धति का उपयोग करके आप मूल रूप से अपने शुद्ध पायथन अनुप्रयोगों को निष्पादन योग्य, संकलित ऑब्जेक्ट कोड में परिवर्तित करने के लिए साइथन का उपयोग कर सकते हैं।

मैं इस पद्धति का उपयोग बहुत अधिक जटिल अनुप्रयोगों के लिए कर रहा हूं - उदाहरण के लिए, एक पूर्ण विकसित पायथन / PySide / Qt अनुप्रयोग।

पायथन के विभिन्न संस्करणों के लिए, आप जीसीसी को सिलाई करते हैं -Iऔर -lसूट करने के लिए स्विच करते हैं।

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


क्या निष्पादन योग्य के बजाय गतिशील लाइब्रेरी बनाने के लिए इस एम्बेडिंग विधि का उपयोग किया जा सकता है?
डेन्फ्रोमुफा

5
यह निष्पादन योग्य में मॉड्यूल (एस) को संकलित नहीं करता है। क्या पोर्टेबल निष्पादन योग्य होना संभव है यानी हर मॉड्यूल जो स्रोत कोड में आयात किया गया था, उस निष्पादन योग्य में संकलित किया जाएगा। @ ब्रोकनमैन
देवेश सैनी

1
@DeveshSaini मैंने उस बिट को जानने का प्रयास करने में समय नहीं बिताया है। एक ही रास्ता है कि मैं ऊपर के रूप में संकलित करने के लिए एक पूर्ण विकसित अजगर + पायसाइड एप्लिकेशन प्राप्त करने में कामयाब रहा, सामान्य फैशन में कार्यक्रम को विकसित करना था - बहुत सारे <mymodule> स्टेटमेंट + इंटरप्रेटर के साथ परीक्षण। फिर जब सब तैयार हो जाता है तो मैं सभी सम्मिलित कोड में मैन्युअल रूप से पेस्ट करता हूं और रीलेवेंट को टिप्पणी करता हूं जिसमें वे बदले गए बयान शामिल होते हैं। हां, यह अवांछनीय है, लेकिन जैसा मैंने पहले कहा था कि मैंने यह देखने के लिए समय नहीं बिताया है कि मैं सिर्फ मुख्य दिनचर्या को कैसे संकलित कर सकता हूं और इसमें शामिल मॉड्यूल को एक साथ जोड़ सकता हूं।
टूटे हुए मनुष्य

3
Libpython के स्थैतिक लिंकिंग के बारे में क्या?
जेम्स मिल्स

4
अजगर 2.7 cython --embed -o /tmp/a.c a.pyऔरgcc -Os -I /usr/include/python2.7 -o /tmp/a/tmp/a.c -lpython2.7 -lpthread -lm -lutil -ldl
dsaydon

17

एक जवाब के लिए कैन सिथॉन के संकलन पर एक नज़र डाल सकते हैं? जो, यहाँ अन्य सभी उत्तरों के विपरीत है, कहते हैं कि हाँ, एक निष्पादन योग्य को संकलित करना संभव है।

एंबेडिंग साइथॉन के लिंक शुरू करने के लिए एक अच्छी जगह है, लेकिन यह साइथन का प्राथमिक उद्देश्य नहीं है, इसलिए मुझे नहीं पता कि यह कितना सीधा होगा।


1
लिंक के लिए धन्यवाद। मुझे यह भी संदेह है कि मैं संभव के रूप में पायथन फ़ाइलों का उपयोग कर सकता हूं। जिसमें निष्पादन योग्य कोड हैं।
मोज़ज़ा

4

मुझे नहीं पता कि इससे मदद मिलेगी या नहीं लेकिन नूडोज़ सही है। आप इसे प्राप्त कर सकते हैं cython --embed -o main.o main.pyऔर फिर मैं सीएल / ईएचएससी के साथ परिणाम संकलित करने का प्रयास करता हूं


-21

आप नहीं कर सकते, साइथन को पायथन को संकलित करने के लिए नहीं बनाया गया है और न ही इसे एक निष्पादन योग्य में बदल दिया गया है।

.Exe फ़ाइल का उत्पादन करने के लिए, py2.exe का उपयोग करें ।

मैक या लिनक्स के लिए एक पैकेज का उत्पादन करने के लिए, नियमन पैकेजिंग सिस्टम प्रक्रिया का उपयोग करें क्योंकि यूनिक्स एनवीवी में एक स्क्रिप्ट भाषा कार्यक्रम के बारे में कुछ भी विशिष्ट नहीं है।


2
वैसे यह मुझे अपनी .py फ़ाइलों को .so फ़ाइलों में बदलने की अनुमति देता है। उपर्युक्त स्क्रिप्ट देखें। .So फ़ाइलों में निष्पादन योग्य कोड नहीं होता है?
मोज़ाज़

यह उद्देश्य नहीं है। साइथन सी / सी ++ पायथन एक्सटेंशन को संकलित करने के लिए है, न कि पायथन स्क्रिप्ट को निष्पादन योग्य बनाने के लिए।
ई-शनि

10
गलत सूचना। वहाँ है cython --embedजो एम्बेड अजगर के साथ निष्पादन योग्य उत्पादन कर सकते हैं।
nudzo

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

2
@ ई-सतीस हां, निष्पादन योग्य को कामेच्छा के संस्करण से जोड़ा जाएगा जो उस समय के खिलाफ संकलित किया गया था। मुद्दा क्या है? यदि यह लिनक्स के लिए है, और यदि आप अपने एप्लिकेशन को वितरित करने की योजना बना रहे हैं, तो आप बस इसे उसी तरह से पैकेज कर सकते हैं, जो आपके द्वारा लक्षित सभी बाइनरी पैकेज की तरह ही है। जैसे myapp_1_wheezy_amd64.deb उस डिस्ट्रो के लिए आपके संकलित अजगर ऐप को python2 या python3 के खिलाफ जोड़ा जाएगा। विंडोज के लिए बस आवश्यक अजगर की आपूर्ति। फिर, मैं यहाँ समस्या, या आपत्ति को देखने में विफल रहता हूँ।
टूटा हुआ आदमी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.