2016-12-10 10 views
0

settings.txt хранится и обрабатывается в скомпилированном однофайльном приложении, но он не записывается. Это работает до компиляции Pyinstaller, когда файл находится в том же каталоге, что и скрипт.Приложение Pyinstaller обращается к файлам txt, но не записывает их (работает до компиляции приложения)

приложение компилируется из терминала:

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

a.datas устанавливается в файле спецификации, как:

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

и файл правильно прочитать в приложении:

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

Однако файл не обновляется при попытке перезаписи файла:

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

    self.Destroy() 

resource_path определяется как:

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) 
+0

'f2.write («обновление»)' вы потеряете данные, если не закрывать файл. Перед выходом из приложения нужно 'f2.close()'. – dsgdfg

+0

Я считаю, что метод close() автоматически вызывается при использовании 'with' – Phillip

+0

Нет, если ваш файл настроек пуст! – dsgdfg

ответ

1

Если вы на Windows, _MEIPASS возвращает «короткое» имя путь в случае, если любой его компонент имеет длину более 8 символов. Итак, чтобы проверить, что это проблема, попробуйте сделать это замороженным приложением one-folder, а затем переместите его простым и коротким путем: например, C:/test.

Если это проблема, вы можете обойти эту проблему путем извлечения длинного пути, используя что-то вроде:

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