日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python实时获取子进程输出_Python 从subprocess运行的子进程中实时获取输出的例子...

發(fā)布時(shí)間:2024/4/13 python 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python实时获取子进程输出_Python 从subprocess运行的子进程中实时获取输出的例子... 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

有些時(shí)候,我們需要將某些程序放到子進(jìn)程中去運(yùn)行,以達(dá)到整合系統(tǒng)的目的。在Python中,一個(gè)非常好的選擇就是使用subprocess模塊,本模塊為開辟子進(jìn)程去執(zhí)行子程序提供了統(tǒng)一的接口,更加便于學(xué)習(xí)和使用。

同時(shí),對于在子進(jìn)程里的程序,我們希望能夠?qū)崟r(shí)獲取其輸出,以在主進(jìn)程中打印相關(guān)信息,使我們能夠了解當(dāng)前子程序的執(zhí)行進(jìn)度。對此,subprocess模塊也提供了相應(yīng)的參數(shù),能夠?qū)⒆映绦虻臉?biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤輸出返回給主程序。

下面,我們就通過一個(gè)例子來說明這個(gè)功能。首先,我們需要一個(gè)用于模擬標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤輸出的“子程序”——subprogram.py:

import sys

import time

for i in range(5):

sys.stdout.write('Processing {}\n'.format(i))

time.sleep(1)

for i in range(5):

sys.stderr.write('Error {}\n'.format(i))

time.sleep(1)

可以看到這個(gè)程序非常簡單,分別向標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤寫入了5條信息,并且輸出之間有1秒的間隔。下面是驅(qū)動這個(gè)“子程序”運(yùn)行的“主程序”——main.py:

import shlex

import subprocess

if __name__ == '__main__':

shell_cmd = 'python3 subprogram.py'

cmd = shlex.split(shell_cmd)

p = subprocess.Popen(cmd, shell=False, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

while p.poll() is None:

line = p.stdout.readline()

line = line.strip()

if line:

print('Subprogram output: [{}]'.format(line))

if p.returncode == 0:

print('Subprogram success')

else:

print('Subprogram failed')

可以看到,我們通過指定stderr=subprocess.STDOUT,將子程序的標(biāo)準(zhǔn)錯(cuò)誤輸出重定向到了標(biāo)準(zhǔn)輸出,以使我們可以直接從標(biāo)準(zhǔn)輸出中同時(shí)獲取標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤的信息。運(yùn)行這個(gè)程序,我們會期待main.py會每秒輸出一次信息到控制臺,但是事實(shí)上,我們直到等了10秒之后才一次性看到所有的10條輸出。

產(chǎn)生這種現(xiàn)象的原因也非常簡單,就是標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤有一個(gè)緩存的概念,它不會立即將程序的標(biāo)準(zhǔn)輸出內(nèi)容返回,而是會做一定的緩存,直到緩存滿或者程序結(jié)束強(qiáng)制清空緩存時(shí)才輸出。了解到問題的原因,解決問題的方法也就一目了然了,我們只需要在子程序中,每次輸出后去手動清空一下緩存即可,以下是修改過的subprogram.py:

import sys

import time

for i in range(5):

sys.stdout.write('Processing {}\n'.format(i))

sys.stdout.flush()

time.sleep(1)

for i in range(5):

sys.stderr.write('Error {}\n'.format(i))

sys.stderr.flush()

time.sleep(1)

經(jīng)過上述的修改之后,再次運(yùn)行main.py程序,我們會看到,每秒會輸出一條信息,達(dá)到了我們在主程序中,去追蹤子程序執(zhí)行過程的目的。

PS:測試環(huán)境是Python3.6.1 Mac版。

以上這篇Python 從subprocess運(yùn)行的子進(jìn)程中實(shí)時(shí)獲取輸出的例子就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持我們。

時(shí)間: 2019-08-14

總結(jié)

以上是生活随笔為你收集整理的python实时获取子进程输出_Python 从subprocess运行的子进程中实时获取输出的例子...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。