2012-05-31 7 views
7

Próbuję uruchomić następujący serwer Pythona pod oknami:Czy można wybrać() w przypadku plików w Pythonie w systemie Windows?

""" 
An echo server that uses select to handle multiple clients at a time. 
Entering any line of input at the terminal will exit the server. 
""" 

import select 
import socket 
import sys 

host = '' 
port = 50000 
backlog = 5 
size = 1024 
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
server.bind((host,port)) 
server.listen(backlog) 
input = [server,sys.stdin] 
running = 1 
while running: 
    inputready,outputready,exceptready = select.select(input,[],[]) 

    for s in inputready: 

     if s == server: 
      # handle the server socket 
      client, address = server.accept() 
      input.append(client) 

     elif s == sys.stdin: 
      # handle standard input 
      junk = sys.stdin.readline() 
      running = 0 

     else: 
      # handle all other sockets 
      data = s.recv(size) 
      if data: 
       s.send(data) 
      else: 
       s.close() 
       input.remove(s) 
server.close() 

pojawia się komunikat o błędzie (10038, „Próbowano przeprowadzić próbę na obiekcie, który nie jest gniazdem”). To prawdopodobnie odnosi się do the remark w dokumentacji Pythona, że ​​"Obiekty plików w systemie Windows nie są akceptowane, ale gniazda są. W systemie Windows podstawowa funkcja select() jest dostarczana przez bibliotekę WinSock i nie obsługuje deskryptorów plików, które nie pochodzą z WinSock. ". W Internecie jest sporo postów na ten temat, ale są one albo zbyt techniczne dla mnie lub po prostu nie jasne. Moje pytanie brzmi: czy jest jakiś sposób, że instrukcja select() w python może być używana pod oknami? Dodaj mały przykład lub zmodyfikuj mój kod powyżej. Dzięki!

+0

hattip @agf. Zanotowano! – inspectorG4dget

+0

Źródło powyższego kodu: http://ilab.cs.byu.edu/python/threadingmodule.html – schmijos

Odpowiedz

7

wyglądało, że nie lubi sys.stdin

Jeżeli zmienisz wejście do tego

input = [server] 

wyjątkiem odejdzie.

To z the doc

Note: 
    File objects on Windows are not acceptable, but sockets are. On Windows, the 
underlying select() function is provided by the WinSock library, and does not 
handle file descriptors that don’t originate from WinSock. 
+0

Dzięki, udało się. – Django

+2

Jak to działa? Oznacza to, że standardowe wejście nigdy nie będzie czytane. To nie wydaje się być rozwiązaniem. – AsksAnyway

5

Nie wiem, czy kod ma inne problemy, ale błąd dostajesz to z powodu przechodzenia input do select.select(), problemem jest to, że zawiera ona sys.stdin który nie jest gniazdem. W systemie Windows select działa tylko z gniazdami.

Na marginesie, input jest funkcją python, nie jest dobrym pomysłem użycie jej jako zmiennej.

0

Oczywiście i odpowiedzi udzielone rację ... po prostu trzeba usunąć sys.stdin od wejścia, ale nadal go używać w iteracji:

dla sw inputready + [sys.stdin ]:

Powiązane problemy