`OSError:[Errno 9]在Windows上使用套接字包装器的文件描述符错误

时间:2017-01-02 11:07:24

标签: python windows python-3.x sockets

我正在为套接字编写一个包装类,因此我可以将它用作类似文件的对象,以便用stdin创建进程的stdoutsubprocess.Popen()

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.makefile()因为它出现io.UnsupportedOperation: fileno错误,但是使用我现在的代码我在Windows上遇到以下错误(在Linux上运行正常):< / p>

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

1 个答案:

答案 0 :(得分:0)

根据关于socket.fileno()的Python文档,声明这在Windows中不起作用。引自Python Documentation

  

socket.fileno()

     

返回套接字的文件描述符(一个小整数)。这对select.select()很有用。

     

在Windows下,此方法返回的小整数不能用于可以使用文件描述符的位置(例如os.fdopen()。 Unix的   没有这个限制。

注意:

上述代码适用于Linux和其他* nix系统。