script para make data compile python executable relative-path pyinstaller

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