Как сделать, чтобы при запуске программы показывалась дата последнего ее запуска?Можно определить дату при помощи модуля time и сохранить в "Блокноте", а при запуске извлекать строку с датой. Может есть другие способы?
Asked
Active
Viewed 222 times
2
Франтишек
- 189
-
Реестр, например. – Владимир Мартьянов Feb 05 '18 at 12:18
-
в python есть модуль для работы с реестром? Или он не нужен? – Франтишек Feb 05 '18 at 12:24
-
Есть модуль, да – Владимир Мартьянов Feb 05 '18 at 12:25
2 Answers
4
Думаю удобнее записав значение в файл. Работа с реестром будет довольно громоздкой, и возможно будет необходим запуск от имени администратора.
Вот вариант с записью в файл
import os, pickle, time
tmp_file = "test.pic"
if os.path.isfile(tmp_file):
t = pickle.load(open(tmp_file, "rb"))
print(t)
else:
print("Time not found")
pickle.dump(str(time.time()), open(tmp_file, "wb"))
Денис
- 864
4
Для переносимости и чтобы проще отлаживать, можно в человекочитаемом формате сохранять время:
import datetime as DT
print(DT.datetime.now(DT.timezone.utc))
# -> 2018-02-07 07:48:55.388757+00:00
Чтобы результат не зависел от текущей рабочей директории (чтобы из любой директории можно было программу запустить), следует полный путь указать к файлу со временем.
Чтобы в общепринятое место пользовательские данные писать, можно appdirs модуль использовать :
#!/usr/bin/env python3
import datetime as DT
from pathlib import Path
import appdirs # $ pip install appdirs
path = Path(appdirs.user_data_dir("Название программы", "Автор")) / 'last_run_time.txt'
# read time of the last program run if available
if path.exists():
last_run_time = DT.datetime.strptime(path.read_text(), '%Y-%m-%d %H:%M:%S.%f+00:00').replace(tzinfo=DT.timezone.utc)
print(last_run_time.astimezone()) # display local time
else: # first run
path.parent.mkdir(parents=True, exist_ok=True)
# update time
now = DT.datetime.now(DT.timezone.utc)
path.write_text(now.isoformat(' '))
jfs
- 52,361
-
Отображается (и записывается) время отстающее на 3 часа. Почему так происходит (живу в Беларуси, время у нас полностью совпадает с московским)? Я убрал в предпоследней строке параметр
DT.timezone.utc. Насколько я понял, это необязательный параметр tzinfo. Время записывается правильное, но в конце добавляются какие-то цифры; а отобразить через print не получается. Выдает ошибку: ValueError: unconverted data remains: .569772 – Франтишек Feb 08 '18 at 19:49 -
1@Франтишек: местное время может прыгать туда-сюда. Хранить следует время в UTC. Если вы это время где-то показываете (и хотите местное время показывать), то просто
print(last_run_time.astimezone())вызовите (это за исключением крайних случаев местное время покажет). Убирать tzinfo не следует изlast_run_time. Показывать можно конечно в любом формате (он не привязан к формату хранения). – jfs Feb 08 '18 at 20:02 -
Интересно почему оно "прыгает" на несколько часов?. Нельзя сделать чтобы было точное время? – Франтишек Feb 08 '18 at 20:12
-
@Франтишек: время точное уже. Под словом "прыгает" я имел ввиду переход с зимнего времени на летнее/перелёты на самолете (когда вы физически в другую часовую зону попадаете)/запустили на другом компьютере (который в другом месте может быть). Какие у вас проблемы с
print(last_run_time.astimezone())кодом? – jfs Feb 08 '18 at 20:58 -
показывает время минус три часа. А если использовать класс today то нормальное.
now = DT.datetime.today().strftime("%Y-%m-%d %H:%M:%S.%f+00:00") path.write_text(now)Он будет показывать правильное время пользователя с другого часового пояса? – Франтишек Feb 09 '18 at 08:36 -
@Франтишек вы хотите сказать, что
print(last_run_time.astimezone())показывает не ваше местное время? (обратите внимание.astimezone()вызов и это единственное изменение кода из ответа, если вы что-то ещё добавили, уберите) Или вы на время в файле смотрите, которое в другом часовом зоне указано? – jfs Feb 09 '18 at 08:39 -
в код приведенный вами выше добавил только одну сроку:
print(last_run_time.astimezone()). Время в файле и в print одинаковое (только в конце строки час. пояса разные). – Франтишек Feb 09 '18 at 09:05 -