【问题标题】:Using sys.stdin in select.select on Windows [duplicate]在 Windows 上的 select.select 中使用 sys.stdin [重复]
【发布时间】:2012-09-12 01:06:15
【问题描述】:

可能重复:
Can select() be used with files in Python under Windows?

在 UNIX 上,我可以在 Python 中将sys.stdin 传递给select.select。我正在尝试在 Windows 上执行此操作,但 Windows 上 Python 中的 select.select 不允许这样做。

要更准确地描述我在做什么,请参阅https://github.com/eldarion/gondor-client/blob/ccbbf9d4b61ecbc2f66f510b993eb5fba0d81c09/gondor/run.py

unix_run_poll 函数是我试图在 Windows 上完成的。基本思想是我有一个到服务器的套接字连接,该服务器已将流式标准输入、标准输出、标准错误连接到远程运行的进程,并且我从本地客户端与它进行交互并使其看起来好像本地客户端正在运行过程。

win32_run_poll 是我尝试将其移植到 Windows 的尝试,它确实可以工作。这有点不稳定,而且 IMO 的方法非常糟糕。

有人对如何改进有建议吗?对win32api的依赖不太理想,但我可以保留它。

【问题讨论】:

  • 您是否查看过专门用于事件循环实现的库/框架?例如,twisted 有两个 Win32 reactor 的实现。
  • 你提到这个很有趣。我碰巧现在正在这样做。 :-)
  • 另一种可能性是实际为您的脚本提供套接字,而不是将其包装为脚本的标准输入/标准输出,然后您就可以使用 select.select。
  • 我的问题表述得不够好。作为发帖者,我知道您不能在 Windows 上的 select 中使用 sys.stdin。您链接的问题正在给出答案。我不想要那个答案。如果您查看我链接的代码,它将表明我比我的问题标题可能推断出的更清楚地理解了这个问题。

标签: python windows winapi network-programming


【解决方案1】:

在 Windows 上,select 仅针对套接字定义,不适用于任意文件句柄(Windows 没有文件描述符的概念)。有关此问题的更多信息,请参阅the msdn documentation,在 select 模块的python documentation 中也提到了这一点。

如果你想对任意文件使用轮询,你应该研究一些抽象轮询套接字和文件句柄的东西。这可能是您帖子的评论中提到的扭曲反应器,也可能是绑定到libuv 的python 或您选择的其他事件库。

【讨论】:

  • 另一种选择是通过pywin32 致电WaitForMultipleObjects
  • 这不太准确。 Python 文档说“在 Windows 上,底层 select() 函数由 WinSock 库提供,并且不处理并非源自 WinSock 的文件描述符。”这也不太准确。正如您所说,Windows 没有文件描述符的概念,但 C 库 (MSVCRT) 有,WinSock 库也有。问题是它们不是同一个概念。 (为了让事情变得更有趣,现代版本的 WinSock 实际上并没有在 select 中使用文件描述符;fd_set 实际上是一个句柄数组……)
  • 似乎 WaitForMultipleObjects/WaitForSingleObject 未定义文件句柄,但它们可用于控制台输入。见msdn.microsoft.com/en-us/library/windows/desktop/…
  • @danvari:将文件句柄传递给Wait 函数将等到该文件的下一次 I/O 完成。如果您有一个不重叠的文件句柄,那么一次只有一个未完成的 I/O,等待会很有用。如果您有一个重叠的句柄,则可能有多个并发 I/O,您无法仅从文件句柄判断哪一个完成。
猜你喜欢
  • 2014-04-10
  • 1970-01-01
  • 2017-06-15
  • 2016-03-10
  • 2016-01-16
  • 2016-09-19
  • 2014-06-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多