午夜视频在线网站,日韩视频精品在线,中文字幕精品一区二区三区在线,在线播放精品,1024你懂我懂的旧版人,欧美日韩一级黄色片,一区二区三区在线观看视频

分享

Python中使用subprocess庫的Popen進行更靈活的進程控制

 啟辰ozkb3yjim4 2018-09-30
對比subprocess.call啟動進程,使用subprocess.Popen能提供細粒度控制。
啟動一個子進程:
process = subprocess.Popen([r'C:\path\to\app.exe', 'arg1', '--flag', 'arg'])
Popen的簽名和和call函數(shù)類似;然而,Popen將會立即返回,而不像call那樣等待子進程完成后返回。
等待子進程完成:
process = subprocess.Popen([r'C:\path\to\app.exe', 'arg1', '--flag', 'arg'])
process.wait()
從子進程中讀取輸出
process = subprocess.Popen([r'C:\path\to\app.exe'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
# 這將阻塞進程直到完成
stdout, stderr = process.communicate()
print stdout
print stderr
在子進程執(zhí)行過程中進行交互
你甚至可以在進程未完成的時對stdin和stdout進行讀寫操作。這個功能在其他程序自動化操作的場景中很有用。
對子線程的寫操作

process = subprocess.Popen([r'C:\path\to\app.exe'], stdout = subprocess.PIPE, stdin =
subprocess.PIPE)
process.stdin.write('line of input\n') 
line = process.stdout.readline() 

然而,如果你你僅僅需要的是一組輸入和輸出,而不是動態(tài)交互,你應該使用communicate()而不是直接訪問stdin和stdout。

從子進程中讀取流
當你想逐行讀取子線程的輸出時,你可以使用下面的代碼片段:
process = subprocess.Popen(<your_command>, stdout=subprocess.PIPE)
while process.poll() is None:
 output_line = process.stdout.readline()

當自命令的輸出不包含EOL字符的情況下,上面的片段將不會如逾期一樣工作。在這種情況下,你可以從輸出中按照字符諸葛讀取,如下:
process = subprocess.Popen(<your_command>, stdout=subprocess.PIPE)
while process.poll() is None: 
  output_line = process.stdout.read(1)
1作為讀取方法的參數(shù),使讀取操作每次讀取一個字符。你可以讀取任意長度的字符。負數(shù)或者0則使read方法一直讀取,直到遇到EOF。在上面的這些代碼片段中,在子線程未完成之前process.poll()的值是None。這在沒有更多輸出需要讀取時判斷是否需要退出循環(huán)很有用。同樣也適用于子進程的錯誤輸出。

    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多