首页 >后端开发 >Python教程 >为什么 Python `subprocess.readline()` 在流式传输 Ruby 输出时挂起,如何修复它?

为什么 Python `subprocess.readline()` 在流式传输 Ruby 输出时挂起,如何修复它?

Linda Hamilton
Linda Hamilton原创
2024-12-21 00:21:09233浏览

Why Does Python `subprocess.readline()` Hang When Streaming Ruby Output, and How Can I Fix It?

Python 子进程 Readlines() 导致流挂起

代码的目标是流式传输 Ruby 文件并逐渐输出其内容。在实现流方面时,遇到 readline() 无限期挂起的问题,从而阻止进一步执行。

潜在解决方案的探索

使用 pty 是依赖于平台的假设 Linux 或兼容操作系统支持的方法。但是,考虑到跨平台兼容性问题:

  • Pexpect: 该库可以提供另一种方法来管理进程交互。
  • stdbuf: 该工具允许在非交互模式下进行行缓冲,从而实现即时
  • 修改后的 pty 方法:

对现有 pty 实现的建议改进:

import errno
import os
import pty
from subprocess import Popen, STDOUT

master_fd, slave_fd = pty.openpty()  # provide tty to enable line-buffering on ruby's side
proc = Popen(['ruby', 'ruby_sleep.rb'],
             stdin=slave_fd, stdout=slave_fd, stderr=STDOUT, close_fds=True)
os.close(slave_fd)
try:
    while 1:
        try:
            data = os.read(master_fd, 512)
        except OSError as e:
            if e.errno != errno.EIO:
                raise
            break  # EIO means EOF on some systems
        else:
            if not data:  # EOF
                break
            print('got ' + repr(data))
finally:
    os.close(master_fd)
    if proc.poll() is None:
        proc.kill()
    proc.wait()
print("This is reached!")

结论

所有三个提议的解决方案都通过启用来解决该问题用于立即输出的行缓冲,而修订后的 pty 方法可确保优雅地处理输入和输出,同时最大限度地提高平台兼容性。

以上是为什么 Python `subprocess.readline()` 在流式传输 Ruby 输出时挂起,如何修复它?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn