2011-02-03 17 views
7

Ho iniziato a utilizzare Pyinstaller su Py2Exe. Tuttavia ho incontrato piuttosto rapidamente un problema. Come escludo i moduli che non desidero e come visualizzo quelli che vengono inclusi nel singolo file eseguibile?Python: Excluding Modules Pyinstaller

Posso rimuovere alcuni file pyd e dll dalla cartella DLL nella mia installazione Python, quindi Pyinstaller non trova e quindi non li include. Non voglio davvero farlo con tutti i moduli dato che diventerà piuttosto arduo.

Ho provato a modificare il file spec reso da Pyinstaller.

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

Ma la dimensione del file è rimasta la stessa quindi concludo che non ha funzionato.

Quindi, come posso vedere quali moduli Pyinstaller sono inclusi e come escludo quelli che non desidero?

risposta

4

È possibile modificare gli elenchi prodotti dalla classe Analysis utilizzando Python. Si noti che questi sono nel formato TOC di PyInstaller.

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

Solo per riepilogare le opzioni qui mentre le uso.

PyInstaller TOC di - sono, come dice la documentazione:

Un sommario sembra essere una lista di tuple nella forma (nome, percorso, typecode). In realtà, è un insieme ordinato, non una lista. Un sommario non contiene duplicati , in cui l'univocità si basa solo sul nome.

In altre, semplicemente:

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

Quindi, nel file .spec - una volta che hai i risultati di analisi dello script - è quindi possibile ulteriormente modificare il rispettivo TOC del mediante:

  • per specifico file/moduli utilizzano la differenza (-) e intersezione (+) operazioni per modificare un sommario. *

  • Per aggiungere/rimuovere liste di file/moduli iterare sul TOC e confrontare con il codice di corrispondenza del modello.

(* Per inciso, per la differenza di lavorare a quanto pare è necessario in modo esplicito cast TOC() e notare che dal momento che è solo il nome che definisce in modo univoco l'elemento del set, avete solo bisogno di specificare che - quindi ('sqlite3', None, None) ecc.)

Un esempio illustrativo (tratto da un file .spec) è sotto dove - nel bene o nel male - rimuovo tutti i riferimenti a scipy, IPython e zmq; eliminare sqlite specifici, tcl/tk e ssl .DLL; inserire un file opencv .DLL mancante; e infine rimuovere tutte le cartelle di dati trovate oltre a quelle di matplotlib ...

Se il Pyinstaller .exe risultante funzionerà quando un file .pyc tenta di caricare un file previsto.La DLL è discutibile :-/

# 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")] 
Problemi correlati