Как отобразить файл, принадлежащий другому потоку?

Я пытаюсь создать приложение, которое отображает в GUI содержимое файла журнала, написанное отдельной программой, которую я вызываю подпроцессом. Приложение работает в Windows и представляет собой двоичный файл, который я не контролирую. Кроме того, это приложение (Actel Designer, если кто-либо заботится) будет записывать свой вывод в файл журнала независимо от того, как я перенаправляю вывод подпроцесса, поэтому использование канала для вывода не представляется возможным. Суть в том, что я, кажется, вынужден считывать из файла журнала, в то время как другой поток может писать на него. Мой вопрос в том, есть ли способ, чтобы я мог постоянно обновлять содержание файла журнала в графическом интерфейсе?

Я пробовал следующее:

  1. Наивное открытие файла для чтения периодически, пока ребенок процесс запущен, вызывает сбой Python (я предполагаю, потому что дочерний поток записывает в файл, пока я пытаюсь прочитать его содержание)
  2. Далее я попытался открыть дескриптор файла до имени файла журнала, прежде чем вызывать дочерний процесс с помощью GENERIC_READ, и SHARED_READ | SHARED_WRITE | SHARED_DELETE и чтение из этого файла. При таком подходе файл выглядит пустым.

Спасибо за любую помощь, которую вы можете предоставить - я не профессиональный программист, и я тянул свои волосы за это неделю.

1
Итак, поток, создающий файл журнала, имеет контроль над обновлением файла? Если это так, попробуйте обновить поток, чтобы приостановить то, что он делает, пока поток чтения читается в файле, а затем закройте файл в потоке чтения и обновите обновление. Другая мысль: иметь файл, принадлежащий третьему потоку, и получить первые два потока, чтобы спросить этот третий поток для любой информации, в которой они нуждаются.
добавлено автор Oliver, источник
Файл журнала создается сторонним программным обеспечением, на котором я не контролирую - это файл .exe на компьютере. Когда он запускается из командной строки (или подпроцесса), он немедленно порождает другой поток. Похоже, что то, что вы описываете, потребует контроля над этим порожденным потоком, и я не вижу способа добиться этого (хотя это полезно для предложений!)
добавлено автор muse_ee, источник

1 ответы

Вы должны зарегистрироваться для уведомлений об изменении файла, способом tail -f (вы можете узнать, какие системные вызовы он использует, выполняя strace tail -f logfile ).

pyinotify provides a Python interface for these file change notifications.

1
добавлено
Спасибо за предложение! Я не думаю, что pyinotify будет работать с Windows, но я нашел другой модуль, который, похоже, делает что-то подобное, называемое Watchdog ( packages.python.org/watchdog ). Я собираюсь узнать, как использовать это и сообщить, работает ли этот подход
добавлено автор muse_ee, источник
Использование решения на основе файлов (Watchdog) решило мою проблему.
добавлено автор muse_ee, источник
Python
Python
7 654 участник(ов)

Уютный чат для профессионалов, занимающихся поиском питоньих мудростей. Как не получить бан: https://t.me/ru_python/577926

Python beginners
Python beginners
4 449 участник(ов)

Вопросы про Python для чайников. Cпам и троллинг неприемлем. Не злоупотребляйте стикерами. Частозадаваемые вопросы: https://github.com/ru-python-beginners/faq/blob/master/README.md Статистика тут: https://grstats.me/chat/x4qym2k5uvfkr3al6at7

pro.python
pro.python
1 090 участник(ов)

Сообщество разработчиков под Python Создатель: @rodgelius

Rude Python
Rude Python
971 участник(ов)

Python без „девочек”, здесь матерятся и унижают Django. Not gay friendly. Правила: t.me/rudepython/114107 @rudepython | t.me/rudepython

rupython
rupython
509 участник(ов)

Группа создана с целью оперативного получения ответов на возникающие вопросы по разработке на яп python, смежные темы, а также человеческого общения. Приветствую!

Python-programming
Python-programming
266 участник(ов)

Чат группы вконтакте https://vk.com/python_community