Agregue el archivo de configuración fuera de Pyinstaller –onefile exe en el directorio dist

Situación

Estoy usando Pyinstaller en Windows para hacer un archivo .exe de mi proyecto.

Me gustaría usar la opción --onefile para tener un resultado limpio y un archivo / progtwig fácil de distribuir.

Mi progtwig usa un archivo config.ini para almacenar las opciones de configuración. Este archivo puede ser personalizado por los usuarios.

Problema

Utilizando la opción de archivo de --onefile , Pyinstaller coloca todos los “archivos de datos” declarados dentro del archivo de archivo .exe único.

He visto esta solicitud pero da instrucciones para agregar un archivo de paquete dentro del archivo único y no afuera, al mismo nivel del .exe y en el mismo directorio dist .

En algún momento he pensado usar un comando shutil.copy dentro del archivo .spec para copiar este archivo … pero creo que estoy en el camino equivocado.

¿Alguien me puede ayudar? Te lo agradeceré 🙂

Un repository en Github me ayudó a encontrar una solución a mi pregunta.

He usado el módulo shutil y el archivo .spec para agregar archivos de datos adicionales (en mi caso, un archivo config-sample.ini ) a la carpeta dist con la opción Pyinstaller --onefile .

Hacer un archivo .spec para pyinstaller

En primer lugar, he creado un archivo makespec con las opciones que necesito:

 $ pyi-makespec --onefile --windowed --name exefilename scriptname.py 

Este comando crea un archivo exefilename.spec para usar con Pyinstaller

Modificar exefilename.spec agregando shutil.copyfile

Ahora he editado el exefilename.spec y al final del archivo se agrega el siguiente código.

 import shutil shutil.copyfile('config-sample.ini', '{0}/config-sample.ini'.format(DISTPATH)) shutil.copyfile('whateveryouwant.ext', '{0}/whateveryouwant.ext'.format(DISTPATH)) 

Este código copia los archivos de datos necesarios al final del proceso de comstackción. Podrías usar todos los métodos disponibles en el paquete de shutil .

Ejecutar PyInstaller

El paso final es ejecutar el proceso de comstackción.

 pyinstaller --clean exefilename.spec 

El resultado es que en la carpeta dist debería tener el archivo .exe comstackdo junto con los archivos de datos copiados.

Consideración

En la documentación oficial de Pyinstaller no encontré una opción para obtener este resultado. Creo que podría ser considerado como una solución … que funciona.