Запись во внешний файл перед отключением - PullRequest
0 голосов
/ 08 сентября 2018

У меня есть программа табло Python, работающая на Raspberry Pi, и она мне нужна, чтобы восстановить информацию о ней после возвращения из отключения (довольно часто там, где я живу).Ниже приведен код только для механизма сохранения:

import pygame
from pygame.locals import *

if os.path.isfile('backup.txt'):
    print('Reloading details from previous game... ')
    backup = open('backup.txt', 'r')

    time_a = float(backup.readline().rstrip('\n'))
    team1name = backup.readline().rstrip('\n').upper()
    team2name = backup.readline().rstrip('\n').upper()
    team1score = int(backup.readline().rstrip('\n'))
    team2score = int(backup.readline().rstrip('\n'))
    currentperiod = int(backup.readline().rstrip('\n'))
    team1fouls = int(backup.readline().rstrip('\n'))
    team2fouls = int(backup.readline().rstrip('\n'))
    possesion = bool(backup.readline().rstrip('\n'))

pygame.time.set_timer(USEREVENT + 1, 100)

while True:  # Main loop
    clock.tick(30)
    for event in pygame.event.get():

        if event.type == USEREVENT + 1:  # Write to backup file
            backup = open('backup.txt', 'w')
            backup.write('{}\n{}\n{}\n{}\n{}\n{}\n{}\n{}\n{}\n'.format(
                str(time_a), team1name, team2name, str(team1score), str(team2score),
                str(currentperiod), str(team1fouls), str(team2fouls), str(possesion)))
            pygame.time.set_timer(USEREVENT + 1, 100)

        if event.type == KEYDOWN:
            if event.key == K_ESCAPE:
                backup.close()
                os.remove('backup.txt')
                sys.exit()

Если я имитирую затемнение, выполнив kill -9 processID, а затем повторно запустите программу, все будет в порядке.Но если я имитирую отключение электроэнергии, потянув за штекер на моем пи, backup.txt будет пустым.

Я попытался изменить частоту сохранения (USEREVENT+1).

Как я могуполучить программу для сохранения в backup.txt до фактического отключения?

1 Ответ

0 голосов
/ 13 сентября 2018

Запись напрямую на диск, а не в буфер, решает проблему. Есть:

backup.flush()
os.fsync(backup.fileno())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...