即使轮询器解除阻止,Python pty也会挂起读取

时间:2018-12-05 06:55:17

标签: python-2.7 polling pty

我正在使用Python的pty模块运行SSH和rsync命令(python 2.7,CentOS Linux版本7.3.1611(核心))。代码是这样的:

self.pid, self.child_fd = pty.fork()
if self.pid == 0:
    os.execv(self.command[0], self.command)

后来我在阅读之前从父进程中进行了一次民意测验:

def check_poll(fds):
    poller = select.poll()
        for fd in fds:
            poller.register(fd, select.POLLIN | select.POLLPRI | select.POLLHUP | select.POLLERR)

    while True:
        results = poller.poll(timeout_ms)
        return [afd for afd, _ in results]

if check_poll([child_fd]):
    os.read(child_fd, 1024) <--- This is where it hangs

我也处理超时问题,但目前无关紧要。

在运行复制大量文件的rsync命令时,它总是挂起。在复制大约相同数量的文件后(根据我使用的打印件),它始终挂起。它提供的输出永远不会是整行,例如:

debug poll: [(15, 1)]
lib/libpangoxft-1.0.la

debug poll: [(15, 1)]
lib/libpangoxft-1.0.so -> libpangoxft-1.0.so.0.3600.8
lib/libpangoxft-1.0.so.0 -> libpangoxft-1.0.so.0.3600.8
lib/libpa

如您所见,该行被切断。 “调试轮询”部分是我的调试打印,以查看发生了什么事件。 1表示这是一个select.POLLIN事件。

我怀疑这可能与缓冲区大小有关。我通常不使用这种低级的东西,所以任何帮助将不胜感激。

更新:我尝试使用-q标志运行rsync,该标志不提供任何输出,并且可以正常运行。我仍然希望能够获得其他用例(例如各种SSH命令)的输出,因此我认为这不是有效的解决方案。

0 个答案:

没有答案