python - para - pyinstaller--add-data
DeterminaciĆ³n de la ruta de la aplicaciĆ³n en un Python EXE generado por pyInstaller (4)
Tengo una aplicación que reside en un solo archivo .py. Pude obtener pyInstaller para agruparlo exitosamente en un EXE para Windows. El problema es que la aplicación requiere un archivo .cfg que siempre se encuentra directamente al lado de la aplicación en el mismo directorio.
Normalmente, construyo la ruta usando el siguiente código:
import os
config_name = ''myapp.cfg''
config_path = os.path.join(sys.path[0], config_name)
Sin embargo, parece que sys.path está en blanco cuando se llama desde un EXE generado por pyInstaller. Este mismo comportamiento se produce cuando ejecuta la línea de comando interactiva de python y trata de recuperar sys.path [0].
¿Hay una forma más concreta de obtener la ruta de acceso de la aplicación que se está ejecutando actualmente para que pueda encontrar los archivos que están relacionados con ella?
Encontré una solución. Debe verificar si la aplicación se está ejecutando como un script o como un archivo comprimido congelado:
import os
import sys
config_name = ''myapp.cfg''
# determine if application is a script file or frozen exe
if getattr(sys, ''frozen'', False):
application_path = os.path.dirname(sys.executable)
elif __file__:
application_path = os.path.dirname(__file__)
config_path = os.path.join(application_path, config_name)
os.path.dirname(sys.argv[0])
Funciona para mi.
De acuerdo con la documentación de pyInstaller, el método sugerido para recuperar la ruta de la aplicación es el siguiente:
#!/usr/bin/python3
import sys, os
if getattr(sys, ''frozen'', False):
# If the application is run as a bundle, the pyInstaller bootloader
# extends the sys module by a flag frozen=True and sets the app
# path into variable _MEIPASS''.
application_path = sys._MEIPASS
else:
application_path = os.path.dirname(os.path.abspath(__file__))
Probado para pyInstaller v3.2, pero esto ciertamente ha estado funcionando también para versiones anteriores.
La solución de Soviut no funciona, al menos no en general para las versiones recientes de pyInstaller (tenga en cuenta que el OP tiene muchos años). Por ejemplo, en MacOS, al agrupar una aplicación en un paquete de un solo archivo, sys.executable
apunta solo a la ubicación del archivo incrustado, que no es la ubicación donde la aplicación se ejecuta realmente después de que el cargador de arranque pyInstaller haya creado una aplicación temporal ambiente. Solo sys._MEIPASS
apunta correctamente a esa ubicación. Consulte esta página doc para obtener más información sobre cómo funciona pyInstaller.
Acorté el código un poco.
import os, sys
if getattr(sys, ''frozen'', False):
application_path = os.path.dirname(sys.executable)
os.chdir(application_path)
logging.debug(''CWD: '' + os.getcwd())
Pero, sys._MEIPASS
apuntó a un directorio incorrecto. Creo que también necesita sys._MEIPASS
+ /app_name