python子进程关闭fd_Python子进程readlines()挂起

本文介绍了在Python中处理子进程的方法,特别是如何关闭子进程的文件描述符并确保实时输出。通过使用pty、pexpect库和stdbuf,以及一个pty的自定义实现,展示了在非交互模式下实现行缓冲的代码示例。
摘要由CSDN通过智能技术生成

小编典典

我假设你pty是出于Q中概述的原因而使用的:为什么不仅仅使用管道(popen())?(到目前为止,所有其他答案都将忽略你的“注意:我不想一次打印所有内容”)。

pty仅在docs中说过是Linux :

由于伪终端处理高度依赖平台,因此有代码仅适用于Linux。(Linux代码应该可以在其他平台上运行,但尚未经过测试。)

目前尚不清楚它在其他操作系统上的运行情况。

你可以尝试pexpect:

import sys

import pexpect

pexpect.run("ruby ruby_sleep.rb", logfile=sys.stdout)

或stdbuf在非交互模式下启用行缓冲:

from subprocess import Popen, PIPE, STDOUT

proc = Popen(['stdbuf', '-oL', 'ruby', 'ruby_sleep.rb'],

bufsize=1, stdout=PIPE, stderr=STDOUT, close_fds=True)

for line in iter(proc.stdout.readline, b''):

print line,

proc.stdout.close()

proc.wait()

或者pty基于@Antti Haapala的答案从stdlib 使用:

#!/usr/bin/env python

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!")

这三个代码示例都立即打印“ hello”(在看到第一个EOL时)。

此处保留旧的更复杂的代码示例,因为可能会在SO的其他帖子中进行引用和讨论

或者使用pty基于@Antti Haapala的答案:

import os

import pty

import select

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'],

stdout=slave_fd, stderr=STDOUT, close_fds=True)

timeout = .04 # seconds

while 1:

ready, _, _ = select.select([master_fd], [], [], timeout)

if ready:

data = os.read(master_fd, 512)

if not data:

break

print("got " + repr(data))

elif proc.poll() is not None: # select timeout

assert not select.select([master_fd], [], [], 0)[0] # detect race condition

break # proc exited

os.close(slave_fd) # can't do it sooner: it leads to errno.EIO error

os.close(master_fd)

proc.wait()

print("This is reached!")

2020-02-12

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值