Como exibir um arquivo pertencente a outro segmento?

Eu estou tentando construir um aplicativo que exibe em uma GUI o conteúdo de um arquivo de log, escrito por um programa separado que eu chamo através de subprocesso. O aplicativo é executado no Windows e é um binário sobre o qual não tenho controle. Além disso, esse aplicativo (o Actel Designer, se alguém se importar) gravará sua saída em um arquivo de log, independentemente de como eu redirecionar a saída do subprocesso; portanto, usar um canal para a saída não parece ser uma opção. A linha inferior é que eu pareço ser obrigado a ler de um arquivo de log ao mesmo tempo que outro segmento pode estar escrevendo para ele. Minha pergunta é se existe uma maneira que eu possa manter a exibição da GUI do conteúdo do arquivo de log em dia de forma robusta?

Eu tentei o seguinte:

  1. Abertura inédita do arquivo para leitura periódica enquanto a criança processo está sendo executado faz com que o Python falhe (eu estou supondo thread filho está escrevendo para o arquivo enquanto eu estou tentando ler o seu conteúdo)
  2. Em seguida, tentei abrir um identificador de arquivo para o nome do arquivo de log antes de invocar o processo filho com GENERIC_READ e SHARED_READ | SHARED_WRITE | SHARED_DELETE e lendo de volta desse arquivo. Com essa abordagem, o arquivo aparece vazio

Obrigado por qualquer ajuda que você possa fornecer - eu não sou um programador profissional e tenho puxado meu cabelo por uma semana.

1
Portanto, o segmento que gera o arquivo de log tem controle sobre quando o arquivo é atualizado? Se for esse o caso, obtenha o thread de atualização para pausar o que está fazendo enquanto o segmento de leitura lê no arquivo, feche o arquivo no thread de leitura e atualize o thread de atualização novamente. Outro pensamento: ter o arquivo de propriedade de um terceiro thread e obter os dois primeiros segmentos para pedir esse terceiro segmento para qualquer informação que eles precisam.
adicionado o autor Oliver, fonte
O arquivo de log é gerado por software de terceiros que eu não tenho controle - é um arquivo .exe no computador. Quando é iniciado a partir da linha de comando (ou subprocesso), ele imediatamente gera outro segmento. Parece que o que você está descrevendo exigiria o controle desse segmento gerado, e eu não vejo uma maneira de conseguir isso (embora esteja aberto a sugestões!)
adicionado o autor muse_ee, fonte

1 Respostas

Você deve se registrar para receber notificações sobre a mudança de arquivo, a maneira tail -f faz (você pode descobrir quais chamadas do sistema ele usa executando strace tail -f logfile ).

pyinotify provides a Python interface for these file change notifications.

1
adicionado
Obrigado pela sugestão! Eu não acho que pyinotify funcionará com o Windows, mas eu encontrei outro módulo que parece fazer algo semelhante chamado Watchdog ( packages.python.org/watchdog ). Eu vou aprender como usar isso e deixar você saber se essa abordagem funciona
adicionado o autor muse_ee, fonte
O uso de uma solução baseada em notificação de arquivo (Watchdog) resolveu meu problema.
adicionado o autor muse_ee, fonte