Python subprocess.Popen 实时输出 stdout(正确管道写法)

Python subprocess.Popen 实时输出 stdout(正确管道写法)大部分的程序是这样的 fromsubproce PIPE STDOUTp Popen cmd stdout PIPE stderr STDOUT shell True whileTrue print p stdout readline ifnotline break 但是由于子程序没有进行

大部分的程序是这样的:

from subprocess import Popen, PIPE, STDOUT p = Popen(cmd, stdout=PIPE, stderr=STDOUT, shell=True) while True: print(p.stdout.readline()) if not line: break

但是由于子程序没有进行 flush 的话,会把结果缓存到系统中。导致程序运行完成,上面的程序才会进行打出(会一直卡在readline这个函数)。

解决方法:

p = subprocess.Popen(cmd, stdout=subprocess.PIPE, bufsize=1) for line in iter(p.stdout.readline, b''): print line, p.stdout.close() p.wait()

实际弱口令我是这样写的

import subprocess #Popen proc = subprocess.Popen(medusaCMD, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True) for line in iter(proc.stdout.readline, 'b'): print line if not subprocess.Popen.poll(proc) is None: if line == "": break proc.stdout.close()

记小的写法

proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) try: while True: buff = proc.stdout.readline() print(buff) if buff == '' and proc.poll() != None: break else: ..... except Exception: data["status"] = -1 finally: return data 

单次管道输出写法

方法一

# -*- coding: UTF-8 -*- import re import sys import subprocess from subprocess import Popen, PIPE, STDOUT #docker_info = {"CONTAINER ID":"", "NAME":"", "CPU %":"", "MEM USAGE / LIMIT":"", \ # "MEM %":"", "NET I/O":"", "BLOCK I/O":"", "PIDS":""} docker_list = [] cmd = "docker stats -a --no-stream" proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) try: buff = proc.communicate() stritem = buff[0] str_list = re.split(r' +|\n', stritem) for i in range(8, len(str_list)-1): if i % 8 == 0: value = 0 docker_info = {} docker_info["CONTAINER ID"] = str_list[i] else: value += 1 if value == 1: docker_info["NAME"] = str_list[i] elif value == 2: docker_info["CPU %"] = str_list[i] elif value == 3: docker_info["MEM USAGE / LIMIT"] = str_list[i] elif value == 4: docker_info["MEM %"] = str_list[i] elif value == 5: docker_info["NET I/O"] = str_list[i] elif value == 6: docker_info["BLOCK I/O"] = str_list[i] elif value == 7: docker_info["PIDS"] = str_list[i] docker_list.append(docker_info) value = 0 print docker_list except Exception as e: print "error", e sys.exit(1) proc.stdout.close()

方法二(待测试)

import subprocess from multiprocessing.dummy import Pool as ThreadPool command = poc + ' -t ' + ip + ' -p ' + port result = subprocess.getoutput(command) if 'WARNING: SERVER IS VULNERABLE' in result: result = AAAAA else: result = BBBBBB 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/220555.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午8:12
下一篇 2026年3月17日 下午8:12


相关推荐

  • OpenClaw Chrome扩展使用教程 – 浏览器中继控制

    OpenClaw Chrome扩展使用教程 – 浏览器中继控制

    2026年3月13日
    2
  • ping和tracert的原理_ping和tracert的作用是什么

    ping和tracert的原理_ping和tracert的作用是什么ping程序是利用icmp的回复请求来探测远端主机是否可达。(并不能继续判断端口是否可达。要想查看端口,就要使用扫描器了。)win2000里的网络库里已经提供网络函数库(icmp.dll)可以实现利用icmp来探测远端主机。相比起使用管道来读ping的结果,或者嵌入ping源码,这个是最简单的方法了(没办法,人懒)。ping其实还有一个R选项,用来记录经过的路由,以前一直不知道。(pingww

    2026年3月9日
    6
  • python与anaconda安装(先安装了python后安装anaconda,基于python已存在的基础上安装anaconda)——逼死强迫症、超详解[通俗易懂]

    python与anaconda安装(先安装了python后安装anaconda,基于python已存在的基础上安装anaconda)——逼死强迫症、超详解[通俗易懂]目录欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML图表FLowchart流程图导出与导入导出导入#一、安装python欢迎…

    2022年6月5日
    594
  • HandlerThread详解「建议收藏」

    HandlerThread详解「建议收藏」转载请注明链接:HandlerThread版本:2018/9/9-1(10:10)HandlerThread问题汇总基本使用(7)源码(7)问题汇总【☆】是补充问题,直接给答案。其余问题答案都在文中。HandlerThread是什么?【☆】HandlerThread任务是并行处理的?不是!是串行处理的。如果一个任务执行…

    2022年7月12日
    19
  • python股票自动交易从零开始-python程序化交易编程-python制作自动交易程序!

    python股票自动交易从零开始-python程序化交易编程-python制作自动交易程序!如何用 python 进行期货程序化交易 程序化交易系统目前主要是通过计算机程序实现的 其实就是把交易者决策的过程用计算机语言描述出来 然后由计算机给出交易建议或直接发送交易指令到期货公司的 SDYGDFHFGJFG 你就是想找个软件或者券商的接口去上传交易指令 你前期的数据抓取和分析可能 python 都写好了 所以差这交易指令接口最后一步 对于股票的散户 正规的法子是华宝 国内量化交易

    2026年3月16日
    2
  • sql中ddl和dml(数据库表与视图的区别)

    DDL和DML的定义和区别1、DML(DataManipulationLanguage)数据操纵语言:适用范围:对数据库中的数据进行一些简单操作,如insert,delete,update,select等.对表(索引和序列)中数据操作就是DML,对数据库中的(表,索引,序列,同义词等)都是DDL操作 2、DDL(DataDefinitionLanguage)数据定义语言:适用范围:对数据库…

    2022年4月17日
    47

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号