Время ожидания аутентификационного токена НЕ соответствует моему опыту - иногда это ровно час, но иногда оно может быть значительно больше (например, несколько часов) или значительно меньше.
У меня есть проект, который отправляетданные в Google Sheets каждую минуту через учетную запись службы.Когда я впервые запустил его, мой сценарий был организован как сценарий KT Work с первоначальной авторизацией входа вне основного цикла.Излишне говорить, что я начал сталкиваться с ошибками 401 НЕСАНКЦИОНИРОВАННО, как и все остальные.
Поэтому я добавил дополнительный gc.login () в основной цикл со счетчиком, чтобы запускать его каждые 45 минут.Я по-прежнему сталкивался с 401 НЕСАНКЦИОНИРОВАННЫМИ сбоями, поэтому я уменьшил его до 30 минут, затем до 20 минут, затем даже до 10 минут, но я все равно видел бы ту же ошибку, по крайней мере, один раз в день, а иногда и больше.
Наконец-то я избавился от счетчика и просто начал выполнять gc.login () на каждой итерации цикла, т. Е. Каждую минуту.Хотя это, как правило, решает 401 НЕСАНКЦИОНИРОВАННЫХ ошибок, это не панацея!Зачем?Потому что теперь я вижу случайные 503 недоступные ошибки, которые имеют тот же эффект остановки сценария.
Так что же является окончательным решением?Добавление простого сторожевого сценария, который выполняет основной сценарий, а затем перезапускает его в случае сбоя.Я попробовал несколько примеров, но я остановился на простом, элегантном, с которым я столкнулся несколько месяцев назад:
[https://www.alexkras.com/how-to-restart-python-script-after-exception-and-run-it-forever/]
Так что я настроил свой собственный "RunScriptForeverWatchdog.py""скрипт выглядит следующим образом:
#!/usr/bin/python
from subprocess import Popen
import sys
filename = sys.argv[1]
while True:
print("\n(Re-)Starting script: " + filename)
p = Popen("python " + filename, shell=True)
p.wait()
Теперь я просто выполняю этот сторожевой скрипт с основным скриптом в качестве аргумента, и каждый раз, когда последний терпит неудачу, он немедленно возрождается первым.