2011-03-20 18 views
7

He conseguido empaquetar mi aplicación PyQt4 como una aplicación "autónomo" en las ventanas, funciona.archivos PyInstaller pero manteniendo .py actualizables

Sin embargo, esta aplicación puede actualizar en sí, que se realiza mediante la sustitución del código real escrito por mí (archivos .py) con nuevas versiones, descargados a través de Internet.

¿Cómo puedo decirle a PyInstaller que haga su trabajo (armar las DLL, generar el iniciador con el ícono brillante, etc.) PERO dejar intactos los archivos .py?

Necesito esos archivos directamente en el disco, para que la actualización automática de trabajo.

Respuesta

4

Puede cambiar el archivo de especificaciones para que no incluya específicamente los archivos por nombre (en la construcción de listas), y luego asegurarse de que estos archivos se incluyen - que tendría que comprobar si hay una opción para incluir, pero no se compile.


yo no he probado esto por mí mismo (yo uso PyInstaller en el trabajo, pero no tienen que creó en mi PC de casa), pero este es el tipo de cosas creo que debe estar bien:

a = Analysis(['main.py']) 
excluded = ['myfile0.py', 'myfile1.py', 'myfile2.py'] 
a.scripts = [script from script in a.scripts if script not in excluded] 
pyz = PYZ(a.pure) 
exe = EXE(a.scripts, pyz, name="main.exe", exclude_binaries=1) 
dist = COLLECT(exe, a.binaries, excluded, name="dist") 
+0

que podía aceptar esto si se pudiera proporcionar una .spec muestra. – Flavius

+0

@Flavius ​​que he proporcionado un ejemplo de una edición a mi Anser, aunque pensar en ello es posible que desee utilizar [co] archivos py dependiendo de quién va a implementar para, si realmente quiere que vean su fuente, y cuánto rendimiento importa – theheadofabroom

0

Creo que el intérprete incrustado en el ejecutable seguirá buscando archivos .py en el mismo directorio y/o PYTHONPATH, py2exe usa un archivo zip para componentes nativos de python, iirc pyinstaller los incrusta en el ejecutable, tal vez exista una opción para mantener un archivo zip como en py2exe (o no agregarlos en la especificación), luego intente ejecutar la aplicación sin los archivos y monitorear los accesos de archivo con procmon.

1

en realidad es más como esto:

a = Analysis(['main.py']) 
excluded = ['pathto\\myfile0.py', 'pathto\\myfile1.py', 'pathto\\myfile2.py'] 
a.scripts = [script from script in a.scripts if script[1] not in excluded] 
pyz = PYZ(a.pure) 
excluded_files_collect = [(f.split('\\')[-1],f,'DATA') for f in excluded] 
exe = EXE(a.scripts, pyz, name="main.exe", exclude_binaries=1) 
dist = COLLECT(exe, a.binaries, excluded_files_collect , name="dist") 

Como la escritura es en realidad una tupla con la forma:

('myfile0.py', 'pathto\\myfile0.py', 'PYSOURCE') 

Usted también puede tener que evitar que los archivos se incluya en PYZ, consulte la pyz toc para ver si se incluyen, logré exluirlos usando excludes = [myfile0] en Analysis().

Cuestiones relacionadas