解决Popen运行程序buff存满、通道阻塞导致进程卡死问题

文章讲述了在Python中,当使用subprocess模块执行命令行程序时,由于大量输出导致进程卡死的问题。作者提供了通过创建临时文件来存储输出结果并避免进程阻塞的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、问题:由于打印较多,buff满了之后会导致进程卡死

例:

import subprocess

cmd = '运行程序的命令行'
p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
p.wait(60)
if p.poll() is None or p.poll() != 0:
     print(f'Failed to run {cmd}. Error code is {p.poll()}')
else:
     output = str(p.stdout.read() #

此时会由于执行命令行程序时输出的信息较多,导致进程卡死,直到超时结束;

2、解决方法:创建一个临时文件,把输出结果存到临时文件中,从临时文件中读取结果

例:

import os
import subprocess
import tempfile

cmd = '需要执行的命令行'
 try:
     # 得到一个临时文件对象, 调用close后,此文件从磁盘删除
     out_temp = tempfile.TemporaryFile(mode='w+')
     # 获取临时文件的文件号
     fileno = out_temp.fileno()
     # stdout=fileone,把输出结果存到临时文件中
     p = subprocess.Popen(cmd, shell=True, stdout=fileno)  
     time.sleep(2)
     p.wait(60)
     if p.poll() is None or p.poll() != 0:
          print(f'Failed to run {cmd}. Error code is {p.poll()}')
     else:
          # 从临时文件中读取执行shell的返回结果
          out_temp.seek(0)  # 表示从文件开头开始读取;用于在文件中移动文件指针的位置
          output = out_temp.read().split('\n')
          print(output)               
except Exception as e:
     print(e)
finally:
     if out_temp:
          out_temp.close()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是小趴菜A

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值