2011-02-03 25 views
7

Comencé a usar Pyinstaller sobre Py2Exe. Sin embargo, rápidamente me encontré con un problema. ¿Cómo excluyo los módulos que no quiero y cómo veo los que se incluyen en el único archivo ejecutable?Python: sin incluir los módulos Pyinstaller

que puede eliminar algunos pyd y dll archivos de la carpeta DLL en mi instalación de Python por lo PyInstaller no encuentra y por lo tanto no los incluye. Realmente no quiero hacer eso con todos los módulos, ya que será bastante arduo.

Intenté editar el archivo de especificaciones que hace Pyinstaller.

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

Pero el tamaño del archivo sigue siendo el mismo, así que concluyo que no funcionó.

Entonces, ¿cómo puedo ver qué módulos están incluyendo Pyinstaller y cómo excluyo los que no quiero?

Respuesta

4

Puede manipular las listas producidas por la clase Analysis utilizando Python. Tenga en cuenta que estos están en el formato TOC de 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 para resumir las opciones aquí cuando los utilizo.

PyInstaller TOC - son, como dice la documentación:

Un TOC parece que hay una lista de tuplas de la forma (nombre, ruta, código_de_tipo). De hecho, es un conjunto ordenado, no una lista. Una TOC no contiene duplicados , donde la exclusividad se basa solamente en el nombre.

En otras palabras, simplemente:

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

Así, en su archivo .spec - una vez que tienes los resultados del análisis de la secuencia de comandos - a continuación, puede modificar aún más la respectiva tabla de contenido para cualquiera:

  • para específica archivos/módulos utilizan la diferencia (-) y la intersección (+) operaciones para modificar una tabla de contenido. *

  • Para agregar/eliminar listas de archivos/módulos iterar sobre el TOC y comparar con el código de coincidencia de patrón.

(* Como acotación al margen, por la diferencia de trabajar parece que debe convertir explícitamente a TOC() y tenga en cuenta que, dado que es sólo el nombre que define de forma única el elemento del conjunto, sólo tiene que especificar que - por lo tanto ('sqlite3', None, None) etc.)

Un ejemplo ilustrativo (tomado de un archivo .spec) está debajo donde, para bien o para mal, elimino todas las referencias a scipy, IPython y zmq; eliminar sqlite específicos, tcl/tk y ssl .DLL's; inserta un archivo .DLL de opencv faltante; y finalmente eliminar todas las carpetas de datos encontradas aparte de matplotlib ...

Si el Pyinstaller resultante .exe funcionará cuando un archivo .pyc intente cargar un esperado.DLL es discutible :-/

# 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")] 
Cuestiones relacionadas