我正在为套接字编写一个包装类,因此我可以将它用作类似文件的对象,以便用stdin
创建进程的stdout
和subprocess.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
答案 0 :(得分:0)
根据关于socket.fileno()
的Python文档,声明这在Windows中不起作用。引自Python Documentation:
socket.fileno()
返回套接字的文件描述符(一个小整数)。这对select.select()很有用。
在Windows下,此方法返回的小整数不能用于可以使用文件描述符的位置(例如
os.fdopen()
)。 Unix的 没有这个限制。
注意:强>
上述代码适用于Linux和其他* nix系统。