2012-09-19 14 views
7

Powiel możliwe:
Can select() be used with files in Python under Windows?Korzystanie sys.stdin w select.select Windows

W systemie UNIX jestem w stanie przekazać sys.stdin do select.select w Pythonie. Próbuję to zrobić w systemie Windows, ale select.select w Pythonie w systemie Windows nie pozwoli na to.

Aby dokładniej opisać, co robię, zobacz: https://github.com/eldarion/gondor-client/blob/ccbbf9d4b61ecbc2f66f510b993eb5fba0d81c09/gondor/run.py.

Funkcja unix_run_poll jest tym, co próbuję wykonać w systemie Windows. Podstawową ideą jest to, że mam połączenie z gniazdem do serwera, który podłączył transmisję stdin, stdout, stderr do procesu działającego zdalnie, i wchodzę z nim w interakcję z lokalnego klienta i wydaje się, że lokalny klient działa proces.

The win32_run_poll jest moją próbą przeniesienia go do systemu Windows i działa, sort. To trochę niesmaczne, a podejście, IMO, jest bardzo złe.

Czy ktoś ma sugestie, w jaki sposób można to poprawić? Zależność od win32api jest mniejsza niż idealna, ale jestem w porządku z jej utrzymaniem.

+1

Czy przeglądałeś biblioteki/frameworki dedykowane implementacjom pętli zdarzeń? Na przykład [twisted] (http://twistedmatrix.com/trac/) ma dwie implementacje [reaktora Win32] (http://twistedmatrix.com/documents/current/core/howto/choosing-reactor.html# win32_wfmo). – user4815162342

+0

Zabawne, że o tym wspomniałeś. Zdarzyło mi się to teraz robić. :-) –

+0

Inną możliwością jest przekazanie skryptu do gniazda, zamiast owijania go jako stdin/stdout skryptu, a następnie można po prostu użyć select.select. – abarnert

Odpowiedz

7

Na Windows select jest zdefiniowany tylko dla gniazd i nie będzie działać dla dowolnych uchwytów plików (okna nie mają pojęcia deskryptorów plików). Aby uzyskać więcej informacji na temat tego problemu, zobacz the msdn documentation, jest również wymieniony w python documentation dla modułu wyboru.

Jeśli chcesz używać odpytywania do plików arbitralnych, powinieneś zajrzeć do czegoś, co streszcza gniazda odpytywania i uchwyty plików. Może to być skręcony reaktor, o którym mowa w komentarzu do twojego posta, lub może to być pyton wiążący się z libuv lub dowolną inną biblioteką zdarzeń do wyboru.

+1

Inną opcją byłoby wywołanie ['WaitForMultipleObjects'] (http: // msdn .microsoft.com/en-us/library/windows/desktop/ms687025% 28v = vs.85% 29.aspx) przez [pywin32] (http://starship.python.net/crew/mhammond/win32/Downloads. html). –

+1

To nie jest całkiem dokładne. Dokumentacja Pythona mówi: "W systemie Windows podstawowa funkcja select() jest dostarczana przez bibliotekę WinSock i nie obsługuje deskryptorów plików, które nie pochodzą od WinSock." To też nie jest całkiem dokładne. Jak mówisz, Windows nie ma pojęcia deskryptorów plików, ale robi to biblioteka C (MSVCRT), podobnie jak biblioteka WinSock. Problem polega na tym, że nie są one tą samą koncepcją.(Aby było jeszcze ciekawiej, współczesne wersje WinSock w rzeczywistości nie używają deskryptorów plików w select, fd_set jest w rzeczywistości tablicą uchwytów ...) – abarnert

+0

Wygląda na to, że obiekty WaitForMultipleObjects/WaitForSingleObject są niezdefiniowane dla uchwytów plików, ale mogą być używane do wejście konsoli. Zobacz http://msdn.microsoft.com/en-us/library/windows/desktop/ms687025(v=vs.85).aspx. – dnaq

Powiązane problemy