Тупая ошибкаPython
Люди добрые, извините, что к вам обращаюсь, уверен, что вопрос для магистров Питона тупой, потому - онанимно.
Хочу сделать на коленке простейшую заглушку на питоне, которая читает файл конфигурации в JSON формате, меняет пару ключей, и записывает обратно. Нужно для быстрого восстановления конфигурации (только избранных ключей) при полном удалении и переустановке в коллабе пакета AUTOMATIC1111 StableDiffusion (что последнее время стало требоваться частенько). Сам я на Питоне практически ни бум-бум, но методом копипасты и выбрасывания лишнего собрал вот такого уродца, и на 90% он работает, кроме самого важного - не читается собственно JSON.
Друзья, огромная, человеческая просьба: не нужно мне рассказывать, что лично вы уже 10 лет работаете в SD и ни единого разрыва ни разу его переставляли; что проще не мучить коллаб, а купить за 100500 денег крутую видяху и поставить SD локально; что вы пользуетесь другой сборкой, и у вас все хорошо и т.д. и т.п. По ряду причин мне подходит именно так; за то, что у вас все по--другому круто получается - заочно рад, но читать об этом интереса не имею.
Кусок кода (там, где "погрызено" - функции, которые не используются и не влияют на чтение; отступы маленько засрались). save_txt в JSONе равен True.
import json
import os
data_path=('/content/gdrive/MyDrive/sd/stable-diffusion-webui')
config_filename = os.path.join(data_path, 'config.json')
config_path = os.path.dirname(config_filename)
assert os.path.exists(config_path), "Config path not exist!"
assert os.path.isfile(config_filename), "Config file not exist!"
print(config_filename)
class OptionInfo:
def __init__(self, default=None, label="", component=None, component_args=None, onchange=None, section=None, refresh=None):
self.default = default
self.label = label
self.component = component
self.component_args = component_args
self.onchange = onchange
self.section = section
self.refresh = refresh
def options_section(section_identifier, options_dict):
for k, v in options_dict.items():
v.section = section_identifier
return options_dict
options_templates = {}
options_templates.update(options_section(('saving-images', "Saving images/grids"), {
"save_txt": OptionInfo(False, "Create a text file next to every image with generation parameters."),
}))
options_templates.update()
print(options_templates.items());
class Options:
data = {}
data_labels = options_templates
typemap = {int: float}
def __init__(self):
""" self.data = {k: v.default for k, v in self.data_labels.items()} """
for k, v in self.data_labels.items():
self.data.setdefault(k, v.default)
print("self.data.items()")
print(self.data.items())
def __getattr__(self, item):
if self.data is not None:
if item in self.data:
return self.data[item]
if item in self.data_labels:return self.data_labels[item].default
return False... погрызено ...
def load(self, filename):
print(filename)
with open(filename, "r", encoding="utf8") as file:
self.data = json.load(file)
print("self.data.items() after json.load(file)")print(self.data.items())
... погрызено ...
opts = Options()
if os.path.exists(config_filename):
opts.load(config_filename)
print(opts.save_txt)
И вывод (переводы строки добавлены для ясности):
/content/gdrive/MyDrive/sd/stable-diffusion-webui/config.json
dict_items([('save_txt', <__main__.OptionInfo object at 0x7f7cb44ee6a0>)])
self.data.items()
dict_items([('save_txt', False)])
/content/gdrive/MyDrive/sd/stable-diffusion-webui/config.json
self.data.items() after json.load(file)
dict_items([('save_txt', False)])
False
Примечания.
1) Закомментированная строчка
по какой-то причине не делает в моем коде ничего; хотя в оригинальном, очевидно, работает.
2) Также в оригинале стоит не data = {}, а data = None - но у меня что-то так тоже не отработало, эмпирически решил инициализировать как пустой dict.
3) Да, не все лишнее выковыряно, в частности - не нужные вне ВЕБ-интерфейса секции, но причина вряд ли в этом.
4) Первая мысль проверить, что читается что-то не то - но файл /content/gdrive/MyDrive/sd/stable-diffusion-webui/config.json 100% существует, и содержит много ключиков; выставленные в начале ассерты тоже проходятся бз ошибок.
5) Но на выходе после self.data = json.load(file) получаем то же самое, что на входе.
6) Если не инициализировать self.data в _init__(self), то на выходе после json.load(file) будет просто пусто и выдастся ошибка.
Какая может быть причина такой печали, что еще можно покрутить? Фантазии уже нет.
Программирование на python
884 поста11.9K подписчика
Правила сообщества
Публиковать могут пользователи с любым рейтингом. Однако!
Приветствуется:
• уважение к читателям и авторам
• конструктивность комментариев
• простота и информативность повествования
• тег python2 или python3, если актуально
• код публиковать в виде цитаты, либо ссылкой на специализированный сайт
Не рекомендуется:
• допускать оскорбления и провокации
• распространять вредоносное ПО
• просить решить вашу полноценную задачу за вас
• нарушать правила Пикабу