簡體   English   中英

subprocess.Popen和緩沖的進程輸出

[英]subprocess.Popen and buffered process output

從python代碼內部,我想運行一個從stdin獲取其參數的二進制程序。 使用子流程模塊,這應該很簡單:

import subprocess
command = [ 'my_program' ]
p = subprocess.Popen( command,  \
        stdin = subprocess.PIPE, stdout = subprocess.PIPE, \
        env={ "GFORTRAN_UNBUFFERED_ALL": "1"} )
p.stdin.write ( stdin_stuff )
while True:
  o = p.stdout.readline()
  if p.poll() != None: 
    break
  # Do something with stdout

現在,這將啟動程序,但是python腳本只是掛在那里。 我知道這很可能是gfortran(我用來編譯my_program緩沖其stdout流的原因)。gfortran允許像我一樣使用GFORTRAN_UNBUFFERED_ALL環境變量,以及使用fortran代碼中固有的FLUSH() ,但仍然沒有運氣:python代碼仍然掛起。

您應該使用Popen.communicate()將字符串發送到進程的stdin更好,而不是手動寫入。

stdoutdata, stderrdata = p.communicate(stdin_stuff)

為了補充Aphex的回答 ,請在此文檔的相關部分:

警告

使用communicate()而不是.stdin.write.stdout.read.stderr.read來避免死鎖,這是由於其他任何OS管道緩沖區中的任何一個填滿並阻塞了子進程造成的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM