Python subprocess.Popen 实时输出 stdout(正确管道写法)
生活随笔
收集整理的這篇文章主要介紹了
Python subprocess.Popen 实时输出 stdout(正确管道写法)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
大部分的程序是這樣的:
from subprocess import Popen, PIPE, STDOUTp = 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 #Popenproc = subprocess.Popen(medusaCMD, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True) for line in iter(proc.stdout.readline, 'b'):print lineif 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:breakelse:..... 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 = 0docker_info = {}docker_info["CONTAINER ID"] = str_list[i]else:value += 1if 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 = 0print docker_list except Exception as e:print "error", esys.exit(1)proc.stdout.close()方法二(待測試)
import subprocess from multiprocessing.dummy import Pool as ThreadPoolcommand = poc + ' -t ' + ip + ' -p ' + port result = subprocess.getoutput(command) if 'WARNING: SERVER IS VULNERABLE' in result:result = AAAAA else:result = BBBBBB?
總結
以上是生活随笔為你收集整理的Python subprocess.Popen 实时输出 stdout(正确管道写法)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows驱动—VS2010+WDK
- 下一篇: 线性表:顺序栈算法实现