Як відобразити файл, який належить іншому потоку?

Я намагаюся створити програму, яка відображає в 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
625 учасників

Канал обговорень про всякі штуки зі світу пайтону. Прохання: 0. мати повагу одне до одного; 1. не матюкатися в сторону людей; 2. не захламляти тред повідомленнями по одному слову;