Работа с Yandex.диском из приложения на Python

Для функционирования моего приложения требуется возможность загрузки на "облачное пространство" и скачивания из него файла базы данных. Зарегистрировав приложение на Яндексе и получив токен, написал скрипт, обеспечивающий данные функции. Пока вызов функции производился из файла, не "отягощенного" формой, все работало как часы. Но как только я стал вызывать его из скрипта, где описана форма на WX, возникла проблема с локалями ("unknown locale: ru-RU"). Поначалу я решил, что мешают выставленные строчки:

import locale
locale.setlocale(locale.LC_ALL, 'ru')
print(locale.getlocale()) выдает ('ru_RU', 'UTF-8')

Но удаление их ничего не изменило. Привожу сильно упрощенный код (не спрашивайте, зачем так, ошибка происходит вне зависимости от набора команд):

# Данный код расположен в отдельном файле YDisk.py

def CloudService(UserToken,FileNameOnPC):
    import yadisk
    
    YandexDisk = yadisk.YaDisk(token=UserToken)
    if YandexDisk.check_token()==True:
        if YandexDisk.exists("/DB/") == False:
            YandexDisk.mkdir("/DB/")  # Создать папку
            print('Папка отсутствовала и была добавлена')
        elif YandexDisk.exists("/DB/") == True:
            YandexDisk.remove("/DB/")
            print('Папка существовала и была удалена')
        #YandexDisk.upload(FileNameOnPC+'.txt', "/DataBaseCounters/%s.txt" % FileNameOnPC, overwrite=True)  # Загружает первый файл

    YandexDisk.clear_session_cache()

Свой токен не привожу, так как все равно результата действия команды на Я.Д вы не увидите. Вызывается скрипт из файла с wx.формой:

from YDisk import CloudService
CloudService ('токен', 'имя файла')

В приведенном варианте кода его вызов проверяет наличие на Я.Д необходимой папки и, если ее нет, создает ее. В случае наличия означенной папки удаляет ее с дальнейшими действиями, которые в скрипте здесь не описываются за непринципиальностью. Стабильной работе скрипта не мешает даже "import wx" в самом начале файла. Однако, стоит добавить строки, описывающие форму:

appMain = wx.App()
frmMain = wx.Frame(None, title="Счетчики", size=(550, 400), pos=(-1,-1))"

cрабатывает только первый пункт, то есть если папки нет, то она создается. Если папка уже есть, появляется длиннющий список ошибок, в конце которых уже упомянутая проблема с локалью.

Traceback (most recent call last):
  File "E:/Счетчики/wxMain_frm.py", line 490, in SaveDataBaseToCloud
    CloudService('AQAretsfAco2s1BZYwjtUjrkBeD8Drk3GQ', "operativeBD")
  File "E:\Счетчики\YDisk.py", line 9, in CloudService
    if YandexDisk.exists("/DB/") == False:
  File "C:\Python\lib\site-packages\yadisk\yadisk.py", line 228, in exists
    return functions.exists(self.get_session(), path, **kwargs)
  File "C:\Python\lib\site-packages\yadisk\functions\resources.py", line 155, in exists
    return _exists(get_meta, session, path, **kwargs)
  File "C:\Python\lib\site-packages\yadisk\functions\resources.py", line 135, in _exists
    get_meta_function(*args, **kwargs)
  File "C:\Python\lib\site-packages\yadisk\functions\resources.py", line 200, in get_meta
    return request.process()
  File "C:\Python\lib\site-packages\yadisk\api\api_request.py", line 142, in process
    return self.process_json(result)
  File "C:\Python\lib\site-packages\yadisk\api\resources.py", line 397, in process_json
    return ResourceObject(js)
  File "C:\Python\lib\site-packages\yadisk\objects\resources.py", line 183, in __init__
    self.import_fields(resource)
  File "C:\Python\lib\site-packages\yadisk\objects\yadisk_object.py", line 86, in import_fields
    self[field] = source_dict[field]
  File "C:\Python\lib\site-packages\yadisk\objects\yadisk_object.py", line 124, in __setitem__
    self.__setattr__(key, value)
  File "C:\Python\lib\site-packages\yadisk\objects\yadisk_object.py", line 107, in __setattr__
    self.FIELDS[attr] = datatype(value) if value is not None else None
  File "C:\Python\lib\site-packages\yadisk\common.py", line 17, in yandex_date
    return datetime.datetime.strptime(string[:-3] + string[-2:], "%Y-%m-%dT%H:%M:%S%z")
  File "C:\Python\lib\_strptime.py", line 268, in <module>
    _TimeRE_cache = TimeRE()
  File "C:\Python\lib\_strptime.py", line 182, in __init__
    self.locale_time = LocaleTime()
  File "C:\Python\lib\_strptime.py", line 69, in __init__
    self.lang = _getlang()
  File "C:\Python\lib\_strptime.py", line 28, in _getlang
    return locale.getlocale(locale.LC_TIME)
  File "C:\Python\lib\locale.py", line 591, in getlocale
    return _parse_localename(localename)
  File "C:\Python\lib\locale.py", line 499, in _parse_localename
    raise ValueError('unknown locale: %s' % localename)
ValueError: unknown locale: ru-RU

Кириллица в названии формы не влияет!!!

ВОПРОС: Как можно вызвать из формы данную функцию, чтобы проблема с локалью не всплывала? Вариант сделать отдельный ехе-файл, выполняющий скрипт взаимодействия с Я.Д и производить его активацию средствами os.startfile не вписывается в философию будущей программы. Нужна бо́льшая гибкость.


Ответы (1 шт):

Автор решения: Незнайка

Проблема вроде бы решилась принудительным импортом локали прямо при вызове из формы пользовательской функции, направленной на взаимодействие с Yandex.Disk. Загрузка локали в самой функции или в глобальной области результата не дает.

    def uploadDB(self,event):
        from GlobalFunction import CloudService
        import locale
        locale.setlocale(locale.LC_ALL, "ru")
        CloudService(self.lstObjects[0][LevelObject][3],
                     'operativeBD', 'to')

→ Ссылка