2012-09-19 16 views
7

Duplicar posibles:
Can select() be used with files in Python under Windows?sys.stdin en select.select en Windows

En UNIX yo soy capaz de pasar a sys.stdinselect.select en Python. Estoy intentando hacer esto en Windows, pero select.select en Python en Windows no lo permitirán.

Para describir con mayor precisión lo que estoy haciendo, vea https://github.com/eldarion/gondor-client/blob/ccbbf9d4b61ecbc2f66f510b993eb5fba0d81c09/gondor/run.py.

La función unix_run_poll es lo que estoy tratando de lograr en Windows. La idea básica es que tengo una conexión de socket a un servidor que conectó la transmisión stdin, stdout, stderr a un proceso que se ejecuta de forma remota y estoy interactuando con él desde el cliente local y haciendo que parezca que el cliente local está ejecutando el proceso.

El win32_run_poll es mi intento de portarlo a Windows y funciona, más o menos. Es un poco inestable y el enfoque, IMO, es muy malo.

¿Alguien tiene sugerencias sobre cómo se puede mejorar esto? La dependencia de win32api es menos que ideal, pero estoy de acuerdo en mantenerla.

+1

¿Ha mirado bibliotecas/frameworks dedicados a implementaciones de bucles de eventos? Por ejemplo, [twisted] (http://twistedmatrix.com/trac/) tiene dos implementaciones de un [Win32 reactor] (http://twistedmatrix.com/documents/current/core/howto/choosing-reactor.html# win32_wfmo). – user4815162342

+0

Es curioso que lo menciones. Yo estaba haciendo eso ahora mismo. :-) –

+0

Otra posibilidad es darle el script al socket, en lugar de finalizarlo como stdin/stdout del script, y luego puede usar select.select. – abarnert

Respuesta

7

En Windows select solo está definido para sockets, y no funcionará para manejadores de archivos arbitrarios (windows no tiene ningún concepto de descriptores de archivos). Para obtener más información sobre este problema, consulte the msdn documentation, también se menciona en el python documentation para el módulo de selección.

Si desea utilizar el sondeo para archivos arbitrarios, debe buscar algo que abstraiga los sockets de sondeo y los identificadores de archivos. Este podría ser el reactor retorcido mencionado en un comentario de su publicación, o podría ser un enlace de pitón al libuv, o alguna otra biblioteca de eventos de su elección.

+1

Otra opción sería llamar a ['WaitForMultipleObjects'] (http: // msdn .microsoft.com/es-us/library/windows/desktop/ms687025% 28v = vs.85% 29.aspx) a través de [pywin32] (http://starship.python.net/crew/mhammond/win32/Downloads. html). –

+1

Esto no es del todo exacto. La documentación de Python dice "En Windows, la función subyacente de selección() es proporcionada por la biblioteca WinSock y no maneja los descriptores de archivos que no se originan en WinSock". Eso tampoco es muy exacto. Como dices, Windows no tiene ningún concepto de descriptores de archivos, pero la biblioteca C (MSVCRT) sí lo tiene, al igual que la biblioteca de WinSock. El problema es que no son el mismo concepto.(Para hacer las cosas aún más divertidas, las versiones modernas de WinSock en realidad no usan descriptores de archivos en select; un fd_set es en realidad una matriz de identificadores ...) – abarnert

+0

Parece que WaitForMultipleObjects/WaitForSingleObject no está definido para identificadores de archivos, pero se pueden usar para entrada de consola Consulte http://msdn.microsoft.com/en-us/library/windows/desktop/ms687025(v=vs.85).aspx. – dnaq