[Python] subprocess: come evitare il freezing durante la lettura dallo stdout di un processo?

G. Allegri giohappy a gmail.com
Mar 14 Apr 2009 16:05:08 CEST


Gentili colleghi pythonisti,
sono alle prese col modulo subprocess, perché devo interagire con
un'applicazione console su Windows (di terze parti), la quale richiede
alla fine dell'esecuzione (e dopo aver stampato i risultati sullo
stdout) che l'utente prema sulla tastiera per fare terminare il
processo.

Sono bloccato alle prime righe:

proc = subprocess.Popen('la_mia_applicazione',
                       shell=True,
                       stdout=subprocess.PIPE,
                       )
stdout_value = proc.communicate()[0]
#stdout_value = proc.stdout.readlines()
PROCESS_TERMINATE = 1
handle = win32api.OpenProcess(PROCESS_TERMINATE, False, proc.pid)
win32api.TerminateProcess(handle, -1)
win32api.CloseHandle(handle)
print stdout_value

Ho usato TerminateProcess per forzare l'uscita dall'applicazione senza
l'interazione con l'utente, ma ricevo un errore di 'Access Denied'
perché, suppongo, proc.communicate (ma anche proc.stdout.readlines)
mantengono un handle su proc in attesa, forse, di un EOF, che non ci
sarà mai poiché l'applicazione non termina...
Se non leggo lo stdout, ovviamente, riesco a forzare il termine del
programma senza errori.

Come posso uscire da questo inghippo?
Grazie,
Giovanni


Maggiori informazioni sulla lista Python