2017-01-02 8 views
0

ソケット用のラッパークラスを作成していましたので、ファイルのようなオブジェクトとして使用することができました。stdinstdoutsubprocess.Popen()Windows上でソケットラッパーを使用しているOSError:[Errno 9] Bad File Descriptor

Traceback (most recent call last): 
    File "C:\Users\admin\Desktop\Projects\Python3\client.py", line 65, in <module> 
    main() 
    File "C:\Users\admin\Desktop\Projects\Python3\client.py", line 62, in main 
    receive_commands2() 
    File "C:\Users\admin\Desktop\Projects\Python3\client.py", line 57, in receive_commands2 
    stdin=stdio) 
    File "C:\Python3\lib\subprocess.py", line 914, in __init__ 
    errread, errwrite) = self._get_handles(stdin, stdout, stderr) 
    File "C:\Python3\lib\subprocess.py", line 1127, in _get_handles 
    p2cread = msvcrt.get_osfhandle(stdin.fileno()) 
OSError: [Errno 9] Bad file descriptor 
+0

メソッドを1行に定義しないでください。これらのメソッドは人間にとっては読めません。 – furas

+0

申し訳ありませんが、急いでいました... – sbrm1

+0

'不正なファイル記述子 'は、ソケットが閉じていることを意味する場合があります。 – furas

答えて

0

によると:それはio.UnsupportedOperation: filenoエラーを与えるとして、私はsocket.makefile()を使用していないが、私の現在のコードで、私は、Windows(Linux上で正常に動作します)に次のエラーを取得しています

def do_task(): 
    global s #The socket 
    class sockIO(): 
     def __init__(self, s):self.s=s 
     def write(self, m): self.s.send(m) 
     def read(self, n=None): return self.s.read() if n is None else self.s.read(n) 
     def fileno(self): return self.s.fileno() 
    #stdio=s.makefile('rw') 
    stdio=sockIO(s) 
    cmd = subprocess.Popen('cmd', shell=True, 
          stdout=stdio, stderr=stdio, 
          stdin=stdio) 

socket.fileno()に関するPythonのドキュメントですが、これはWindowsでは動作しません。 Python Documentationから引用:

socket.fileno()

Return the socket’s file descriptor (a small integer). This is useful with select.select().

Under Windows the small integer returned by this method cannot be used where a file descriptor can be used (such as os.fdopen()). Unix does not have this limitation.

注:

上記のコードはLinuxや他の* nixシステムで動作します。

関連する問題