scipy pyinstaller

Pyinstaller--onefile warning pyconfig.h al importar scipy o scipy.signal



(5)

Ampliando la solución de Ilya, creo que esta es una solución un poco más robusta para modificar el archivo de especificaciones (de nuevo, después de la declaración a = Análisis ...).

a.datas = list({tuple(map(str.upper, t)) for t in a.datas})

Solo probé esto en un pequeño programa de prueba (uno con una sola declaración de importación e impresión), pero parece funcionar. a.datas es una lista de tuplas de cadenas que contienen las rutas pyconfig.h. Los convierto a minúsculas y luego dedup. De hecho, encontré que convertirlos a todos en minúsculas era suficiente para que funcionara, lo que me sugiere que el programa de instalación de pyinstaller realiza una reducción de mayúsculas y minúsculas cuando debería ser sensible a mayúsculas en Windows. Sin embargo, yo mismo hice la deducción por si acaso.

Esto es muy simple de recrear. Si mi script foo.py es:

import scipy

Entonces corre:

python pyinstaller.py --onefile foo.py

Cuando lanzo foo.exe me sale:

WARNING: file already exists but should not: C:/Users/username/AppData/Local/Temp/_MEI86402/Include/pyconfig.h

He probado algunas versiones, pero la última que he confirmado es 2.1dev-e958e02 que se ejecuta en Win7, Python 2.7.5 (32 bits), Scipy versión 0.12.0

He enviado un ticket con la gente de Pyinstaller pero todavía no he escuchado nada. ¿Alguna pista de cómo depurar esto aún más?


Ejecuté la utilidad archive_viewer.py (de PyInstaller) en uno de mis propios archivos ejecutables --onefile que tiene el mismo error y descubrí que pyconfig.h está incluido dos veces:

(31374007, 6521, 21529, 1, ''x'', ''include//pyconfig.h''), (31380528, 6521, 21529, 1, ''x'', ''Include//pyconfig.h''), (31387049, 984, 2102, 1, ''x'', ''pytz//zoneinfo//CET''),

Lamentablemente, sin embargo, no sé cómo solucionarlo.

Enlace del manual de PyInstaller: http://www.pyinstaller.org/export/d3398dd79b68901ae1edd761f3fe0f4ff19cfb1a/project/doc/Manual.html#archiveviewer


La respuesta de wtobia @ funcionó para mí. Consulte https://github.com/pyinstaller/pyinstaller/issues/783

  1. Vaya a C:/Python27/Lib/site-packages/PyInstaller/build.py
  2. Encuentra la función de def append(self, tpl):
  3. Cambie if tpl[2] == "BINARY": a if tpl[2] in ["BINARY", "DATA"]:

Me di cuenta de que el problema es que Windows no distingue entre mayúsculas y minúsculas y estas 2 declaraciones son directorios de origen "duplicados: include / pyconfig.h Include / pyconfig.h

Mi solución es ajustar manualmente el archivo .spec después de la llamada a = Analysis ():

import platform if platform.system().find("Windows")>= 0: a.datas = [i for i in a.datas if i[0].find(''Include'') < 0]

Esto funcionó en mis 2 pruebas.

Una solución más flexible sería revisar TODOS los elementos para detectar colisiones que no distingan entre mayúsculas y minúsculas.


Puede hackear el archivo de especificaciones para eliminar la segunda instancia agregando estas líneas después de un = Análisis:

for d in a.datas: if ''pyconfig'' in d[0]: a.datas.remove(d) break