2012-09-19 9 views
7

Eventuali duplicati:
Can select() be used with files in Python under Windows?Utilizzando sys.stdin in select.select su Windows

Su UNIX sono in grado di passare a sys.stdinselect.select in Python. Sto tentando di farlo su Windows, ma select.select in Python su Windows non lo consentirà.

Per descrivere più accuratamente cosa sto facendo vedere https://github.com/eldarion/gondor-client/blob/ccbbf9d4b61ecbc2f66f510b993eb5fba0d81c09/gondor/run.py.

La funzione unix_run_poll è ciò che sto cercando di ottenere su Windows. L'idea di base è che ho una connessione socket a un server che ha collegato streaming stdin, stdout, stderr a un processo in esecuzione in remoto e sto interagendo con esso dal client locale e facendolo apparire come se il client locale stia eseguendo il processi.

Il win32_run_poll è il mio tentativo di portarlo su Windows e funziona, una specie di. È un po 'traballante e l'approccio, IMO, è pessimo.

Qualcuno ha suggerimenti su come questo può essere migliorato? La dipendenza da win32api non è l'ideale, ma io sono d'accordo nel mantenerlo.

+1

Hai esaminato librerie/framework dedicati alle implementazioni del ciclo degli eventi? Ad esempio, [twisted] (http://twistedmatrix.com/trac/) ha due implementazioni di un [reattore Win32] (http://twistedmatrix.com/documents/current/core/howto/choosing-reactor.html# win32_wfmo). – user4815162342

+0

Divertente, lo dici. Mi è capitato di farlo adesso. :-) –

+0

Un'altra possibilità è quella di dare effettivamente lo script al socket, invece di avvolgerlo come stdin/stdout dello script, e quindi puoi semplicemente usare select.select. – abarnert

risposta

7

Su Windows select è definito solo per socket e non funziona per handle di file arbitrari (Windows non ha alcun concetto di descrittori di file). Per ulteriori informazioni su questo problema, vedere the msdn documentation, è anche menzionato nello python documentation per il modulo selezionato.

Se si desidera utilizzare il polling per i file arbitary, è necessario esaminare qualcosa che estrae socket di polling e handle di file. Questo potrebbe essere il reattore twistato a cui si fa riferimento in un commento al tuo post, oppure potrebbe essere un collegamento Python a libuv o un'altra libreria di eventi di tua scelta.

+1

Un'altra opzione sarebbe chiamare ['WaitForMultipleObjects'] (http: // msdn .microsoft.com/it/us/library/windows/desktop/ms687025% 28v = vs.85% 29.aspx) tramite [pywin32] (http://starship.python.net/crew/mhammond/win32/Downloads. html). –

+1

Questo non è abbastanza preciso. La documentazione di Python dice "Su Windows, la funzione select() sottostante è fornita dalla libreria WinSock e non gestisce i descrittori di file che non provengono da WinSock." Anche questo non è abbastanza preciso. Come dici tu, Windows non ha alcun concetto di descrittore di file, ma la libreria C (MSVCRT) lo fa, e così anche la libreria WinSock. Il problema è che non sono lo stesso concetto.(Per rendere le cose ancora più divertenti, le versioni moderne di WinSock in realtà non usano i descrittori di file in select, un fd_set è in realtà una serie di handle ...) – abarnert

+0

Sembra WaitForMultipleObjects/WaitForSingleObject non è definito per gli handle di file, ma possono essere utilizzati per ingresso della console. Vedi http://msdn.microsoft.com/en-us/library/windows/desktop/ms687025(v=vs.85).aspx. – dnaq

Problemi correlati