2017-12-07 46 views
7

का आकार घटाना मेरे पास एक साधारण पांडा pyinstaller exe है जो 40 एमबी से अधिक है।pyinstaller exe

मेरे exe उदाहरण:

इस के लिए
import collections 
import csv 
import selenium 
import pandas 

print('hi') 

40MB + थोड़ा overkill लगता है।

मैं जितना संभव हो इसे कम कर सकता हूं?

एक विधि:

pyinstaller --onefile --exclude matplotlib --exclude scipy --exclude pandas --exclude numpy.py 

हालांकि यह विचार कितना बड़ा अपवर्जन सूची होगी व्यावहारिक नहीं है।

मैं मॉड्यूल प्राप्त करने और अन्य सभी चीज़ों को बाहर करने के लिए pyinstaller के लिए फ़ोल्डर कैसे चुनूं ताकि मेरे पास एक छोटा सा एप्लीकेशन हो?

युक्ति फ़ाइल:

a = Analysis(['123.py'], 
      pathex=['C:\\Users\\AA\\ZZ'], 
      binaries=[], 
      datas=[], 
      hiddenimports=[], 
      hookspath=[], 
      runtime_hooks=[], 
      excludes=[], 
      win_no_prefer_redirects=False, 
      win_private_assemblies=False, 
      cipher=block_cipher) 
pyz = PYZ(a.pure, a.zipped_data, 
      cipher=block_cipher) 
exe = EXE(pyz, 
      a.scripts, 
      a.binaries, 
      a.zipfiles, 
      a.datas, 
      name='123', 
      debug=False, 
      strip=False, 
      upx=True, 
      runtime_tmpdir=None, 
      console=True) 

यह भी उल्लेख के लायक है। डिफ़ॉल्ट रूप से, Pyinstaller पांडा का पता नहीं लगाता है।

जोड़ें:

hiddenimports = ['pandas._libs.tslibs.timedeltas'] 

To: C:\Users\<NAME>\AppData\Local\Programs\Python\Python36\Lib\site-packages\PyInstaller\hooks 

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

+0

यदि आप निर्भरताओं को हटाते हैं, तो exe आपकी स्क्रिप्ट चलाने में सक्षम नहीं होगा, या क्या मुझे कुछ याद आ रहा है? –

+1

@FlorentB। Pyinstaller पैकेजिंग अन्य सामान की जरूरत नहीं है। इसके अलावा, उस exe के लिए 40 एमबी? मैंने इसे यूपीएक्स करने की कोशिश की, लेकिन यह मेरे लिए ज्यादा नहीं बदल रहा है। यह गलत करना होगा। –

+0

जब मैं 'pyinstaller --onefile test.py' करता हूं (test.py में आपका उदाहरण होता है), मुझे निष्पादन योग्य मिलता है जो लगभग 5 एमबी है। –

उत्तर

3

एक virtualenv के साथ अपने परिवेश सेट करने की कोशिश, और आभासी env के साथ काम करने पर

कुछ जानकारी वहाँ केवल आवश्यक पुस्तकालयों में स्थापित यहां हैं: https://virtualenv.pypa.io/en/stable/

+0

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

+1

हाँ - यह कुछ हद तक एक अजगर वर्चुअलबॉक्स की तरह है - सभी संकुल एक अलग आभासी env में स्थापित हैं, और मुख्य पायथन स्थापना को प्रभावित नहीं करते हैं। इसे हटाने से सिर्फ एक निर्देशिका हट रही है, और आपके पास पुस्तकालयों और संस्करणों के –

+0

के विभिन्न संयोजनों के साथ सीवरल वर्चुअलेंव हैं I वर्चुअल वातावरण से परिचित नहीं हैं, लेकिन मुझे होना होगा। वर्चुअल बॉक्स पर pyinstaller का उपयोग समस्या पैदा कर रहा है। शायद एक आभासी env ठीक हो जाएगा। –

0

अजगर दुभाषिया और सभी आयातित मॉड्यूल में शामिल किए गए हैं निष्पादन योग्य

आप अपनी स्पेक फ़ाइल में Analysis के तहत excludes सूची में उन मॉड्यूल को जोड़ने का प्रयास कर सकते हैं जिन्हें आप बाहर करना चाहते हैं।

आप यूपीएक्स का उपयोग कर निष्पादन योग्य को संपीड़ित करने का भी प्रयास कर सकते हैं। A note on using UPX

+0

क्या यह डिफ़ॉल्ट रूप से अपक्स नहीं करता है? मेरे पास संभवतया आदर्श नहीं होने के लिए बड़ी संख्या में मॉड्यूल हैं। किसी दिए गए निर्देशिका को छोड़कर सभी मॉड्यूल को बाहर नहीं किया गया है? –

+0

मैंने सोचा कि यह स्वचालित रूप से परेशान था, मेरी गलती। कुछ ऐसा: pyinstaller -F --upx-dir सी: \ उपयोगकर्ता \ DD \ डाउनलोड \ upx394w \ upx394w \ 123 \ upx308w \ upx.exe zz.spec हालांकि काम नहीं करता है। –

3

मुझे लगता है कि ये दोनों उत्तर उत्कृष्ट हैं।

मेरे लिए, यह पांडा का उपयोग करने का एक साधारण मामला है कि exe विशाल है।

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

मुझे यह बहुत कम हो गया और यह डिफ़ॉल्ट रूप से ऐसा नहीं कर रहा था।

कहा जा रहा है कि अंतिम और सबसे अधिक आयात समाधान यहां बताया गया है: Importing Python modules from a select location। तो एक ऐसी सुविधा थी जिसने यह सब किया, लेकिन अब कुछ मैन्युअल हैंडलिंग शामिल है क्योंकि: मल्टीपाकेज-बंडल टूटा हुआ है।

अब के बहुत सारे के लिए सरल उपाय करने के लिए exe के

आप कई निष्पादनयोग्य है, तो मैं अत्यधिक इस दृष्टिकोण की सिफारिश: abc.py फ़ोल्डर में से एक निर्देशिका में

pyinstaller -F abc.py --onedir (Have all imports of both scripts) 
pyinstaller -F abd.py --onedir (Have all imports of both scripts) 

अब डाल abd.exe साथ ही साथ किसी अन्य बाहरी स्क्रिप्ट्स। सुनिश्चित करें कि वे अलग-अलग नाम हैं या केवल एक स्क्रिप्ट चलती है।

यह वास्तव में अच्छी तरह से काम करता है क्योंकि सभी निर्भरता एक फ़ोल्डर में हैं। इसे इस तरह का होना चाहिए है। तो इस उदाहरण में कहें कि आपके पास 40 एमबी एक फ़ोल्डर था। प्रत्येक अतिरिक्त exe के बाद, यह केवल 40 एमबी के बजाय + 5 एमबी (या exe कितना बड़ा होगा) होगा।