python os.popen.readlines异常_Python subprocess readlines()挂起

我假设您使用pty是由于Q: Why not just use a pipe (popen())?中列出的原因(到目前为止,所有其他答案都忽略了您的“注意:我不想一次打印所有内容”)。Because pseudo-terminal handling is highly platform dependent, there

is code to do it only for Linux. (The Linux code is supposed to work

on other platforms, but hasn’t been tested yet.)

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

您可以尝试pexpect:import sys

import pexpect

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

或者^{}在非交互模式下启用行缓冲: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()#!/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)。

把旧的更复杂的代码示例留在这里,因为它可能会在其他文章中被引用和讨论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!")

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值