2011-02-03 22 views
7

मैंने Py2Exe पर Pyinstaller का उपयोग करना शुरू कर दिया है। हालांकि मैं जल्दी से एक समस्या में भाग गया है। मैं उन मॉड्यूल को कैसे बहिष्कृत करूं जो मैं नहीं चाहता हूं, और मैं उन निष्पादन योग्य फ़ाइल में शामिल होने वाले लोगों को कैसे देखूं?पायथन: मॉड्यूल को छोड़कर पाइइंस्टॉलर

मैं अपने पायथन इंस्टॉलेशन में DLL फ़ोल्डर से pyd और dll फ़ाइलों को हटा सकता हूं, इसलिए पाइइंस्टॉलर नहीं ढूंढता है और इसलिए उन्हें शामिल नहीं करता है। मैं वास्तव में सभी मॉड्यूल के साथ ऐसा नहीं करना चाहता क्योंकि यह काफी कठिन हो जाएगा।

मैंने स्पीक फ़ाइल को संपादित करने का प्रयास किया जो पाइंस्टॉलर बनाता है।

a.binaries - [('ssl','pydoc',)], 

लेकिन फ़ाइल का आकार वही बना रहा, इसलिए मैंने निष्कर्ष निकाला कि काम नहीं किया।

तो मैं कैसे देख सकता हूं कि कौन से मॉड्यूल पाइंस्टॉलर शामिल हैं और मैं उन लोगों को कैसे बाहर कर सकता हूं जिन्हें मैं नहीं चाहता हूं?

उत्तर

4

आप पाइथन का उपयोग करके विश्लेषण कक्षा द्वारा उत्पादित सूचियों में हेरफेर कर सकते हैं। ध्यान दें कि ये PyInstaller के TOC प्रारूप में हैं।

a = Analysis(...) 
... 
# exclude anything from the Windows system dir  
a.binaries = [x for x in a.binaries if not 
       os.path.dirname(x[1]).startswith("C:\\Windows\\system32")] 
19

बस यहां उपयोग किए जाने वाले विकल्पों को सारांशित करने के लिए।

PyInstaller टीओसी का - कर रहे हैं, के रूप में प्रलेखन कहते हैं:

एक टीओसी प्रपत्र (नाम, पथ, typecode) की tuples की एक सूची प्रतीत होता है। वास्तव में, यह एक आदेश दिया गया सेट है, सूची नहीं। एक टीओसी में डुप्लीकेट नहीं होते हैं, जहां विशिष्टता केवल नाम पर आधारित होती है।

Otherwords में, बस:

a_toc = [('uname1','/path/info','BINARY'),('uname2','/path/to','EXTENSION')...] 

तो, अपने .spec फ़ाइल में - एक बार आप स्क्रिप्ट के विश्लेषण से परिणाम मिल गया है - आप तो आगे संबंधित टीओसी की या तो द्वारा संशोधित कर सकते हैं:

संचालन और चौराहे (+) एक टीओसी संशोधित करने के लिए -()
  • विशिष्ट के लिए फ़ाइलें/मॉड्यूल अंतर का उपयोग करें। *

  • को जोड़ने/हटाने के लिए टीओसी पर फ़ाइलों/मॉड्यूल के सूचियों और पैटर्न मिलान कोड के साथ तुलना करें।

(* एक अलग रूप में, अंतर काम करने के लिए यह आप स्पष्ट रूप से TOC() को डाल सकते हैं और ध्यान दें, चूंकि यह केवल नाम है जो विशिष्ट सेट के तत्व को परिभाषित करता है चाहिए लगता है, आप केवल उस निर्दिष्ट करने की आवश्यकता के रूप में - इसलिए ('sqlite3', None, None) इत्यादि)

एक उदाहरण उदाहरण (एक .spec फ़ाइल से लिया गया) नीचे है - बेहतर या बदतर के लिए - मैं scipy, ipython और zmq के सभी संदर्भों को हटा देता हूं; विशिष्ट स्क्लाइट, टीसीएल/टीके और एसएसएल हटाएं डीएलएल; एक लापता opencv डालें डीएलएल; और आखिरकार matplotlib वाले लोगों के अलावा पाए गए सभी डेटा फ़ोल्डरों को हटा दें ...

क्या परिणामस्वरूप Pyinstaller .exe तब काम करेगा जब कोई .pyc फ़ाइल अपेक्षित लोड करने का प्रयास करती है।डीएलएल म्यूट :-/

# Manually remove entire packages... 

a.binaries = [x for x in a.binaries if not x[0].startswith("scipy")] 

a.binaries = [x for x in a.binaries if not x[0].startswith("IPython")] 

a.binaries = [x for x in a.binaries if not x[0].startswith("zmq")] 

# Target remove specific ones... 

a.binaries = a.binaries - TOC([ 
('sqlite3.dll', None, None), 
('tcl85.dll', None, None), 
('tk85.dll', None, None), 
('_sqlite3', None, None), 
('_ssl', None, None), 
('_tkinter', None, None)]) 

# Add a single missing dll... 

a.binaries = a.binaries + [ 
    ('opencv_ffmpeg245_64.dll', 'C:\\Python27\\opencv_ffmpeg245_64.dll', 'BINARY')] 

# Delete everything bar matplotlib data... 

a.datas = [x for x in a.datas if 
os.path.dirname(x[1]).startswith("C:\\Python27\\Lib\\site-packages\\matplotlib")] 
संबंधित मुद्दे