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

G. Allegri giohappy a gmail.com
Mer 15 Apr 2009 12:23:40 CEST


Risolto usando SendKeys [1], il quale usa chiamate alle API di
windows.h. E' inevitabile dal momento che "Press any key" si aspetta
un segnale di basso-livello della console, e non da standard input.

[1] http://www.rutherfurd.net/python/sendkeys/

Il 15 aprile 2009 10.43, G. Allegri <giohappy a gmail.com> ha scritto:
> Sì, ho provato sia con
>
> stdout_value = proc.communicate('\n')[0]
>
> che con
>
> proc.stdin.write('\n')
>
> ma niente da fare. Addirittura con SendKeys non ottengo il risultato...
>
> Il 14 aprile 2009 16.05, G. Allegri <giohappy a gmail.com> ha scritto:
>> 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