Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 4, 2017 23:59:30

Guljaca
От:
Зарегистрирован: 2011-07-11
Сообщения: 93
Репутация: +  0  -
Профиль   Отправить e-mail  

Python 3 Сохранение состояния программы

Интересует, есть ли в Python модули, позволяющие сохранять состояние программы.
Сейчас я не придумал ничего лучше, как сохранять основные переменные, по которым можно будет восстановить состояние программы, в текстовый документ.

Вот только беда: написать прогу для считывания этих параметров проблематично. Например, в xml tree, я работаю с элементами в определенных ячейках памяти. При повторном считывании документа, создаются новые элементы уже в других ячейках. И понять, какой именно элемент был сохранен можно только по его атрибутам, в которых может быть записано что-угодно.

Т.е проблема решаема, но заставляет помучиться.

П.с Знаю, что это как с кнопкой в Photoshop "сделать все хорошо", но мало ли.



Отредактировано JOHN_16 (Дек. 5, 2017 10:53:48)

Офлайн

#2 Дек. 5, 2017 01:43:22

papuas
Зарегистрирован: 2015-06-19
Сообщения: 159
Репутация: +  6  -
Профиль   Отправить e-mail  

Python 3 Сохранение состояния программы

Не совсем понятно, что вы хотите, но все человечество давно работает с файлами конфигураций.
Хранить конфиги можно в файлах или бд.
Для работы с конфиг файлами в python есть модуль
ConfigParser.
Если конечно я правильно понял вопрос.

Офлайн

#3 Дек. 5, 2017 08:48:36

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Python 3 Сохранение состояния программы

Guljaca
есть ли в Python модули, позволяющие сохранять состояние программы.
А вы не пробовали окошечко свернуть? Состояние программы при этом почти сохраняется. Окошко потом развернуть можно. Чем это отличается от того что вам нужно?



Офлайн

#4 Дек. 5, 2017 10:12:13

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Python 3 Сохранение состояния программы

Guljaca
модули, позволяющие сохранять состояние программы.
давайте вы уточните что такое в вашем понимании “состояние программы”?
Это некие параметры типа размер окошек, их положение, отображено/скрыто, галки в чекбоксах или значения в лайнедитах?
Для этого есть модули работы с файлами, configparser, QSettings, PyYAML, json, xml в зависимости от выбраного формата в котором вы собираетесь “хранить состояние”.
Guljaca
И понять, какой именно элемент был сохранен можно только по его атрибутам, в которых может быть записано что-угодно. пример, в xml tree, я работаю с элементами в определенных ячейках памяти.
Вы работаете напрямую с памятью? очень сомневаюсь… тем более что xml tree это не позволяет , опишите более внятно что вы делаете, используя общепринятые формулировки, дабы не возникло недопонимания.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Дек. 5, 2017 10:15:15)

Офлайн

#5 Дек. 5, 2017 13:32:38

Guljaca
От:
Зарегистрирован: 2011-07-11
Сообщения: 93
Репутация: +  0  -
Профиль   Отправить e-mail  

Python 3 Сохранение состояния программы

Под записью информации в текстовый файл я и подразумевал различные текстовые форматы, типа .xml, .ini, да и просто .txt
doza_and Последовательность свернуть окошечко, выключить ПК, включить ПК, развернуть окошечко не всегда работает.
Под сохранением состояния программы, могу привести в качество примера Ren-Py. Внутри можно нагородить сколь угодно сложный код, но при сохранении будет открыто именно то место, на котором ты остановился.
Ниже пример работы с XML и описание того, чего я хочу добиться.


import xml.etree.ElementTree as ET
import os
import random

class Element():
def __init__(self, info):
self.info = info


c_element_d = {}

with open("xml/test.xml", 'rb') as xml_file:
tree = ET.parse(xml_file)
root = tree.getroot()
# Выглядит глупо, но тут может быть и куда более сложная информация. Это пример
c_element_d[root] = Element(root.tag)
for child in root:
c_element_d[child] = Element(root.tag)
# Как пример, при первом запуске получаю значения
# <Element 'element' at 0x0000000002700D68
# <Element 'element' at 0x0000000002700D86

# При втором запуске (загрузке) получаю значения для тех же элементов
# <Element 'element' at 0x0000000002700D12
# <Element 'element' at 0x0000000002700D45

# Load
# При загрузке информации мне нужно автоматически показать информацию
# Из элемента <Element 'element' at 0x0000000002700D68>, найдя его среди
# <Element 'element' at 0x0000000002700D12
# <Element 'element' at 0x0000000002700D45
# Что можно сделать через Element.info. Т.е сравнив часть или всю информацию
# В данном случае тег элемента. Вот только для этих элементов он совпадает,
# следовательно будет выбран из них случайный, что в данном случае роли не играет
# но только в данном случае


chosen_el = random.choice(list(c_element_d.keys()))
# Выбираю <Element 'element' at 0x0000000002700D68>
# Вывожу значения какой-нибудь переменной
print(c_element_d[chosen_el].info)

# Save
# Записываю в файл (формат любой), скажем, значение Element.info (т.е тег элемента)



Отредактировано Guljaca (Дек. 5, 2017 13:32:58)

Офлайн

#6 Дек. 5, 2017 16:41:15

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Python 3 Сохранение состояния программы

читал диагонально практически, но как то подумалось - а не pickle здесь какой нибудь ли нужен



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#7 Дек. 5, 2017 20:45:29

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Python 3 Сохранение состояния программы

Guljaca
выключить ПК, включить ПК, развернуть окошечко не всегда работает.
А вы можете привести пример когда это работает? Если нажать кнопку power то никто и пикнуть не успеет.
Надо не выключать а переводить в режим гибернации.

Если вы опираетесь на адреса переменных при работе программы например на 0x0000000002700D12, то вы написали программу с недетерминированным поведением, ее поведение не будет повторяться от запуска к запуску. Обычно это признак наличия грубейших логических ошибок в коде. Объясните какая вам разница по какому адресу разместились данные в памяти? Почему это вас волнует?

В вашем коде не нашел ни малейших попыток сохранить состояние. Что вы имеете ввиду? Напишите по человечески, над тем что вы написали можно фантазировать бесконечно.
1. те приведите корректный код который вы у себя запускаете
2. опишите последовательность действий и среду исполнения ОС версию интерпретатора и т.п.
3. опишите результат
4. опишите что в этом результате вас не устраивает.




Отредактировано doza_and (Дек. 5, 2017 20:48:03)

Офлайн

#8 Дек. 6, 2017 10:50:12

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Python 3 Сохранение состояния программы

Guljaca
Под сохранением состояния программы, могу привести в качество примера Ren-Py. Внутри можно нагородить сколь угодно сложный код, но при сохранении будет открыто именно то место, на котором ты остановился.
Ну Ren-Py программа с открытым исходным кодом да еще и о боже, написана на пайтоне. Можете посмотреть как там у них все организовано https://github.com/renpy/renpy, чтобы понять что во первых задача далеко не тривиальна и одной строкой не решается. В вторых программа Ren-Py имеет достаточно строгую архитектуру и проэкт там состоит не из чего попало, а из определенных модулей Labels, Screens, Transforms, Definitions и тд… и все это там взаимосвязано .Вот ото обходит все эти элементы и записывает в файл, а при последующем запуске считывает. Никакой магии.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version