क्या स्थैतिक बाइनरी में एक अजगर आवेदन को संकलित करने का एक तरीका है?


86

जो मैं करने की कोशिश कर रहा हूं वह मेरे कोड को एक दूरस्थ सर्वर पर भेज रहा है, जिसमें अलग-अलग अजगर संस्करण स्थापित हो सकते हैं और / या मेरे ऐप के लिए पैकेज की आवश्यकता नहीं हो सकती है।

अभी इस तरह की पोर्टेबिलिटी हासिल करने के लिए मुझे दुभाषिया और कोड के साथ रिलेक्वेबल वर्चुअन का निर्माण करना होगा। उस दृष्टिकोण में कुछ मुद्दे हैं (उदाहरण के लिए, आपको अपने वर्चुअलाइजेशन में पुस्तकालयों के एक समूह को मैन्युअल रूप से कॉपी करना होगा, क्योंकि --always-copyयह अपेक्षित रूप से काम नहीं करता है) और आम तौर पर धीमा।

वहाँ (सिद्धांत रूप में) एक तरीका है कि खुद को अजगर बनाने के लिए।

मुझे आश्चर्य है कि अगर मैं अपने कोड के साथ दुभाषिया को एक बाइनरी में पैक कर सकता हूं और अपने एप्लिकेशन को मॉड्यूल के रूप में चला सकता हूं। कुछ इस तरह: ./mypython -m myapp runया ./mypython -m gunicorn -c ./gunicorn.conf myapp.wsgi:application


क्या आपको cx_freeze जैसा कुछ मतलब है?
टाइगरहॉक 3

@ TigerhawkT3, मैंने आज तक कभी भी cx_freeze के बारे में नहीं सुना। डॉक्स के माध्यम से देखा, ऐसा लगता है कि यह वही है जो मैं चाहता हूं, लेकिन यह Ubuntu 12.04.5 पर python3.5.1 के साथ निर्माण करने में विफल रहता है। मैं विकल्पों की तलाश कर रहा हूं, सही दिशा में किक के लिए धन्यवाद।
रोबोसलोन

अफसोस की बात है, pyinstaller Django 1.9 के साथ काम नहीं करता है और py2app / py2exe लाइनक्स का समर्थन नहीं करता है :(
roboslone

2
अगर cx_Freeze और pyinstaller काम नहीं करते हैं, तो अभी भी उम्मीद है। आप अपने लक्ष्य वितरण (वितरणों) के लिए पैकेज बना सकते हैं जो स्थापना पर निर्भरता को हल करेगा। या, हो सकता है कि अपने ऐप को चलाने के लिए docker जैसे कुछ का उपयोग करें।
KeatsPeeks

1
अन्य विकल्प हैं नुत्का और साइथन
डेन्फ्रोमोफा

जवाबों:


121

आपकी समस्या को हल करने के लिए दो तरीके हो सकते हैं

  1. स्थिर बिल्डर, जैसे फ्रीज़, या pyinstaller, का उपयोग करेंpy2exe
  2. संकलन का उपयोग करें cython

मैं समझाता हूं कि आप इसे दूसरे का उपयोग करके कैसे कर सकते हैं, क्योंकि पहली विधि क्रॉस प्लेटफॉर्म और संस्करण नहीं है, और अन्य उत्तरों में समझाया गया है। इसके अलावा, pyinstaller जैसे कार्यक्रमों का उपयोग आमतौर पर बड़े फ़ाइल आकारों में होता है, जहां साइथन का उपयोग करने के परिणामस्वरूप एक फ़ाइल होगी जो आकार में केबी है।

सबसे पहले, स्थापित करें cython। फिर, अपनी अजगर फ़ाइल (नाम test.py) को एक .pyxफ़ाइल में बदल दें

sudo pip install cython
mv test.py test.pyx

फिर, आप cythonइसे संकलित करने के लिए GCC के साथ उपयोग कर सकते हैं ( cythonपायथन .pyxफ़ाइल से C फ़ाइल उत्पन्न करता है , और फिर GCC C फ़ाइल संकलित करता है)

( https://stackoverflow.com/a/22040484/5714445 के संदर्भ में )

cython test.pyx --embed
gcc -Os -I /usr/include/python3.5m -o test test.c -lpython3.5m -lpthread -lm -lutil -ldl

नोट : अजगर के अपने संस्करण के आधार पर, आपको अंतिम कमांड को बदलना पड़ सकता है। यह जानने के लिए कि आप किस अजगर का संस्करण उपयोग कर रहे हैं, बस उपयोग करें

$ python -V

अब आपके पास एक बाइनरी फ़ाइल 'टेस्ट' होगी, जिसे आप ढूंढ रहे हैं

अन्य बातों पर ध्यान दें :

  1. पायथन कार्यक्रमों को गति देने के लिए स्थैतिक स्मृति आवंटन के लिए सी-टाइप वैरिएबल परिभाषाओं का उपयोग करने के लिए साइथन का उपयोग किया जाता है। आपके मामले में, आप अभी भी पारंपरिक पायथन परिभाषाओं का उपयोग कर रहे हैं।
  2. यदि आप अतिरिक्त पुस्तकालयों का उपयोग कर रहे हैं (जैसे opencv, उदाहरण के लिए), तो आपको उन्हें उपयोग करके निर्देशिका प्रदान करनी पड़ सकती है -Lऔर फिर -lजीसीसी फ्लैग्स में पुस्तकालय का नाम निर्दिष्ट करना होगा । इस बारे में अधिक जानकारी के लिए कृपया GCC झंडे देखें

20
नमस्ते, क्या होगा अगर मेरा आवेदन कई फाइलों में फैला है। यह दृष्टिकोण केवल वर्तमान स्क्रिप्ट को संकलित करने के लिए लगता है और सभी पायथन निर्भरता को नहीं।
RChat

2
अभी आपकी python फ़ाइल (test test कहो) को एक pyx में नाम बदलने की आवश्यकता नहीं है
iMath

3
यह मेरे लिए बहुत मददगार था। कई फ़ाइलों के बारे में सवाल का जवाब देने के लिए, आप साइटथोनाइज का उपयोग कर सकते हैं: cythonize -i file_0.py [...] file_n.pyअपने सभी अजगर मॉड्यूल के लिए, फिर cython main_file.py --embedअपनी मुख्य स्क्रिप्ट के लिए। आप एक निष्पादन योग्य और .so फाइलें (.dll, .dylib अपने ओएस पर निर्भर करता है) के साथ समाप्त करेंगे जो आप एक स्टैंडअलोन समाधान के रूप में एक साथ उपयोग कर सकते हैं।
एएफपी

मुझे "एनकोडिंग नाम का कोई मॉड्यूल नहीं मिल रहा है"। मुझे पता चला कि मुझे अजगर की स्थापना से कुछ फाइलों की आवश्यकता है। हालाँकि, मेरे लक्ष्य प्रणाली में अजगर नहीं है। कृपया मदद करे।
अभिरोरा

9

आप Nuitka की जांच करना चाह सकते हैं । यह अजगर स्रोत कोड लेता है और इसे C ++ API कॉल में परिवर्तित करता है। फिर यह एक निष्पादन योग्य बाइनरी (लिनक्स पर ईएलएफ) में संकलित करता है। यह अब कुछ वर्षों के लिए है और पायथन संस्करणों की एक विस्तृत श्रृंखला का समर्थन करता है।

यदि आप इसका उपयोग करते हैं तो आपको संभवतः एक प्रदर्शन सुधार भी मिलेगा। सिफारिश की।


मुझे Django के साथ Nuitka का उपयोग करने के बारे में कोई जानकारी नहीं मिली। क्या आपको, किसी भी मौके पर, ऐसा अनुभव है?
रोबोसलोन

@roboslone, प्रखर अग्रवाल साइथन वास्तव में अच्छी तरह से बाहरी पुस्तकालयों का समर्थन करते हैं, जब नुत्का पाइपी के स्थिर बिल्डर की तुलना में। उदाहरण के लिए, इस टिप्पणी के अंत में लिंक से, "लोग साइथॉन का उपयोग करते हैं क्योंकि यह उन्हें एक समस्या को हल करने में मदद करता है। जो या तो यह है कि वे पायथन कोड से बाहरी गैर-पायथन पुस्तकालयों से कनेक्ट करना चाहते हैं या वे जो सक्षम होना चाहते हैं। मैन्युअल रूप से उनके कोड, या दोनों को अनुकूलित करें। ", लिंक blog.behnel.de/posts/indexp241.html
RS निखिल कृष्ण

1
आरएस निखिल कृष्ण, मैं अपने कोड को तेज करने की कोशिश नहीं कर रहा हूं, मैं इसे एक बाइनरी में अजगर दुभाषिया के साथ जहाज करने की कोशिश कर रहा हूं।
रोबोसलोन

आह ठीक है। मुझे लगा कि आप इसे किसी बाहरी पुस्तकालय से बांधना चाहते हैं। मेरी गलती।
आरएस निखिल कृष्ण

2

आप शायद फ्रीज़ जैसी किसी चीज़ की तलाश कर रहे हैं, जो अपने सभी पुस्तकालयों के साथ अपने पायथन एप्लिकेशन को स्थिर बाइनरी में संकलित करने में सक्षम है:

फ्रीज का PyPi पेज

फ्रीज का पायथन विकी पेज

फ्रीज का स्रोत पृष्ठ


1

यदि आप एक मैक पर हैं, तो आप एक .app बंडल बनाने के लिए py2app का उपयोग कर सकते हैं, जो उस पर डबल-क्लिक करने पर आपका Django ऐप शुरू करता है।

मैंने बताया कि कैसे Django और CherryPy को बंडल करने के लिए https://moosystems.com/articles/14-distribute-django-app-as-native-desktop-app-01.html

लेख में मैं एक स्थानीय अनुप्रयोग विंडो में अपने Django साइट को प्रदर्शित करने के लिए pywebview का उपयोग करता हूं।


मेरा आवेदन ज्यादातर लिनक्स पर चलता है, इसलिए
py2app

हालांकि लेख py2app का उपयोग करता है, यह pyinstaller का उपयोग करके भी किया जा सकता है।
एंड्रे ऑलिच

0

फ्रीज विकल्प:

हालाँकि, आपके लक्ष्य सर्वर में वह वातावरण होना चाहिए जो आप चाहते हैं -> आपको इसे 'बनाने' में सक्षम होना चाहिए। यदि ऐसा नहीं होता है, तो आपको पर्यावरण से मेल खाने के लिए अपने सॉफ़्टवेयर का निर्माण करना चाहिए।

मुझे यह आसान मार्गदर्शिका मिली कि आप एक वर्चुअलेनव के कस्टम संस्करण को कैसे स्थापित करें, यह मानते हुए कि आपके पास ssh एक्सेस है: https://stackoverflow.com/a/5507373/5616110

Virtualenv में, आपको कुछ भी स्थापित करने में सक्षम होना चाहिए और आपको sudo विशेषाधिकारों के बारे में चिंता करने की आवश्यकता नहीं होनी चाहिए। बेशक, उन जैसे और पैकेज मैनेजर तक पहुँचने के लिए सब कुछ बहुत आसान हो जाता है।


मैं पहले से ही virtualenv का उपयोग कर रहा हूं, यह मामला नहीं है। मेरा प्रश्न सांख्यिकीय रूप से संकलित अजगर आवश्यक मॉड्यूल और अनुप्रयोगों के बारे में है।
रोबोसलोन

फिर आपको इसे फ्रीज करना होगा, इसके अलावा कोई और रास्ता नहीं।
iScrE4m
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.