簡體   English   中英

python Popen 掛起

[英]python Popen hangs

我使用 Popen 打開 tclsh,並嘗試通過 PIPE 發送命令來運行puts aaaaaaaaaaa...命令(aaa... 很長)

它工作正常,但是,當我運行命令兩次(aaaa... 需要足夠長的時間),並且我通過 PIPE 讀取標准輸出時,代碼將掛起

我試圖放大默認 bufsize,但它不起作用

到底發生了什么? 有人可以幫忙嗎?

proc = Popen(
    ['C:\\Tcl\\bin\\tclsh.exe'],
    stdin=PIPE,
    stdout=PIPE,
    stderr=PIPE
)

proc.stdin.write(bytearray('puts ' + 'a' * 100000 + 'ends\n', 'utf-8'))
proc.stdin.write(bytearray('puts ' + 'a' * 100000 + 'ends\n', 'utf-8'))
proc.stdin.flush()

stdout = b''
while proc.poll() == None:
    if stdout.endswith(b'ends'):
        break
    else:
        stdout += proc.stdout.read1(1)

print(stdout.decode('utf-8'))

最后,我在標准輸出中使用 tempfile 代替 PIPE

    self._tempfile = tempfile.mktemp()
    self._tempfile_in = open(self._tempfile, 'wb')
    self._tempfile_out = open(self._tempfile, 'rb')

    self._process = subprocess.Popen(
        [self.tcl_exe] + list(self.tcl_exe_args),
        stdin = subprocess.PIPE,
        stdout = self._tempfile_in,
        stderr = subprocess.PIPE)

……

    self._tempfile_out.read1(1)

pipe 緩沖區不是無限大的。 您填充了標准輸入緩沖區,然后 tclsh 填充了它的標准輸出緩沖區,並且它無法繼續讀取下一行,直到您從標准輸出中提取某些內容。 因此,您在第二次寫入時被阻止了。

暫無
暫無

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

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