#python-3.x #self-updating
#python-3.x #самообновление
Вопрос:
У меня есть код, который архитектурно близок к опубликованному ниже (к сожалению, я не могу опубликовать полную версию, потому что она является частной). У меня есть самообновляющийся исполняемый файл, и я пытаюсь протестировать эту функцию. Мы предполагаем, что полный путь к этому файлу будет A.some_path
указан после выполнения input
. Моя проблема в том, что утверждение не удалось, потому что при втором вызове os.stat
все еще возвращается статистика предыдущего файла (я полагаю, он думает, что ничего не могло измениться, поэтому в этом нет необходимости). Я попытался запустить это вручную, и самообновление работает совершенно нормально, и файл действительно удаляется и воссоздается с изменением статистики. Существует ли какой-либо гарантированный способ принудительного os.stat
повторного чтения статистики файлов по тому же пути или альтернативный вариант, чтобы он работал (кроме воссоздания A
объекта)?
from pathlib import Path import unittest import os class A: some_path = Path() def __init__(self, _some_path): self.some_path = Path(_some_path) def get_path(self): return self.some_path class TestKit(unittest.TestCase): def setUp(self): pass def check_body(self, a): some_path = a.get_path() modification_time = os.stat(some_path).st_mtime # Launching self-updating executable self.assertTrue(modification_time lt; os.stat(some_path).st_mtime) def check(self): a = A(input('Enter the file pathn')) self.check_body(a) def Tests(): suite = unittest.TestSuite() suite.addTest(TestKit('check')) return suite def main(): tests_suite = Tests() unittest.TextTestRunner().run(tests_suite) if __name__ == "__main__": main()
Комментарии:
1. На какой операционной системе вы работаете и как изменяется файл? Если я
os.stat()
несколько раз запускаю файл, в который записывается, время mtime каждый раз меняется.2. @match Я получаю эту проблему на Win10. Ну, исполняемый файл загружает новую версию из сети во временную папку, запускает этот временный файл, затем удаляет существующий, но уже готовый старый исполняемый файл, копирует себя по старому пути (с переименованием, если это необходимо), запускает нормально со старого места (но с новым исполняемым файлом) и, наконец, удаляет временный исполняемый файл.
Ответ №1:
Я нашел истоки проблемы: я попытался запустить самообновление, с помощью os.system
которого дождитесь завершения процесса. Но во-первых: во время самообновления мы запускаем несколько отдельных процессов и на самом деле должны ждать, пока все они закончатся, и во-вторых: даже сигнал о том, что процесс заканчивается, не означает, что ОС действительно полностью обновляет файл, и похоже assertTrue
, что мы еще не закончили со всеми нашими процедурами. Для своей задачи я просто использовал sleep
, но нормальное решение должно анализировать существующие процессы в системе и ждать их завершения, или, по крайней мере, должно быть несколько попыток с ожиданием.