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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python父进程调用子进程_Python2.7下,调用subprocess启动子进程,读取子进程标准输出若干问题...

發布時間:2023/12/19 python 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python父进程调用子进程_Python2.7下,调用subprocess启动子进程,读取子进程标准输出若干问题... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1:如果調用的子進程也是一個python腳本,則subprocess.Popen中的bufsize=1無效果。也就是說,即使設置了bufsize=1表示進行行緩沖,子進程如果不顯示調用sys.stdout.flush,父進程依然會阻塞在readline上:

#testbuf.py

importsubprocess

cmd= "./testsub.sh"cmd2= ["python", "testsub.py"]

sp= subprocess.Popen(cmd2, bufsize = 1, stdout =subprocess.PIPE)whileTrue:

line=sp.stdout.readline()print 'read line is', lineif not line: break

testsub.py代碼如下:

importtimeimportsysfor i in range(100000):print 'hello, world', i#sys.stdout.flush()

time.sleep(1)

執行testbuf.py腳本,該腳本將會阻塞在sp.stdout.readline()上,除非將子進程testsub殺掉,否則,該腳本將會長時間阻塞在這條語句上。

如果將testsub.py中的sys.stdout.flush()前注釋去掉,則父進程可以得到正常的輸出。

如果執行的是shell腳本testsub.sh,則沒有這種問題,該腳本代碼如下:

#!/bin/bashfor((i=1;i<=10000000;i++));do

echo“hello, world”, $isleep 1

done

2:如果子進程是一個長時間運行的程序,而父進程想以行為單位實時讀取子進程的輸出,則父進程不能以for line in sp.stdout的形式讀取子進程輸出:

#testbuf.py

import subprocess

cmd= "./testsub.sh"cmd2= ["python", "testsub.py"]

sp= subprocess.Popen(cmd2, bufsize = 1, stdout =subprocess.PIPE)for line insp.stdout:

print'read line is', lineif not line: break

這種情況下,進程阻塞在for line in sp.stdout上。這實際上是python2的一個bug:

https://bugs.python.org/issue3907

https://stackoverflow.com/questions/2804543/read-subprocess-stdout-line-by-line

https://ubuntuforums.org/showthread.php?t=916518

這個bug在python3中據說解決了,但是在python2下,還是不可以用for line in sp.stdout這種形式。可以使用readline:

for line in iter(proc.stdout.readline,''):

print line

3:如果子進程有大量輸出,而父進程調用subprocess.Popen時又設置了stdout = subprocess.PIPE,并且沒有及時讀取stdout中的內容,則一旦緩沖區滿了(緩沖區默認大小為65535),則子進程會在寫入標準輸出時hang住。

總結

以上是生活随笔為你收集整理的python父进程调用子进程_Python2.7下,调用subprocess启动子进程,读取子进程标准输出若干问题...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。