python 标准错误输出_python – 如何打印和显示subprocess stdout和stderr输出而不失真?...

使用

fcntl.fcntl使管道无阻塞,并使用

select.select等待数据在任一管道中可用.例如:

# Helper function to add the O_NONBLOCK flag to a file descriptor

def make_async(fd):

fcntl.fcntl(fd, fcntl.F_SETFL, fcntl.fcntl(fd, fcntl.F_GETFL) | os.O_NONBLOCK)

# Helper function to read some data from a file descriptor, ignoring EAGAIN errors

def read_async(fd):

try:

return fd.read()

except IOError, e:

if e.errno != errno.EAGAIN:

raise e

else:

return ''

process = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

make_async(process.stdout)

make_async(process.stderr)

stdout = str()

stderr = str()

returnCode = None

while True:

# Wait for data to become available

select.select([process.stdout, process.stderr], [], [])

# Try reading some data from each

stdoutPiece = read_async(process.stdout)

stderrPiece = read_async(process.stderr)

if stdoutPiece:

print stdoutPiece,

if stderrPiece:

print stderrPiece,

stdout += stdoutPiece

stderr += stderrPiece

returnCode = process.poll()

if returnCode != None:

return (returnCode, stdout, stderr)

请注意,fcntl仅适用于类似Unix的平台,包括Cygwin.

如果你需要它在没有Cygwin的Windows上工作,它是可行的,但它更加困难.你必须:

>使用pywin32库调用本机Win32 API

>使用SetNamedPipeHandleState和PIPE_NOWAIT使stdout和stderr管道无阻塞

>使用WaitForMultipleObjects而不是选择等待数据变为可用

>使用ReadFile读取数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值