La aplicación Pyinstaller está accediendo a archivos txt, pero no está escribiendo en ellos (funciona antes de comstackr la aplicación)

settings.txt se almacena y se accede dentro de la aplicación comstackda de un solo archivo, pero no se está escribiendo. Esto funciona antes de la comstackción de Pyinstaller cuando el archivo está en el mismo directorio que el script.

La aplicación se comstack desde el terminal:

pyinstaller script.spec script.py --windowed --onefile

a.datas se establece en el archivo de especificaciones como:

a.datas += [('settings.txt','/path/to/settings.txt', "DATA”)]

y el archivo se lee correctamente dentro de la aplicación:

 with open(resource_path('settings.txt'), 'r') as f2 

Sin embargo, el archivo no se actualiza al intentar sobrescribir el archivo:

 def OnExit(self, event): with open(resource_path('settings.txt'), 'w') as f2: f2.write('update') self.Destroy() 

resource_path se define como:

 def resource_path(relative_path): """ Get absolute path to resource, works for dev and for PyInstaller """ try: # PyInstaller creates a temp folder and stores path in _MEIPASS base_path = sys._MEIPASS except Exception: base_path = os.environ.get("_MEIPASS2", os.path.abspath(".")) return os.path.join(base_path, relative_path) 

Si está en Windows, _MEIPASS devuelve el nombre “corto” para la ruta en caso de que alguno de sus componentes tenga más de 8 caracteres. Entonces, para probar que este es el problema, intente convertirlo en una aplicación congelada de one-folder y luego muévala en una ruta simple y corta: por ejemplo, C:/test .

Si este es el problema, puede solucionar el problema recuperando la ruta larga utilizando algo como:

 if hasattr(sys, '_MEIPASS'): import win32api sys_meipass = win32api.GetLongPathName(sys._MEIPASS)