[英]python pipe limited to 196608 ( 65536*3 ) with subprocess.Popen()
我有此函數call_external_command
如果len(data)<= 196608沒關系,但是如果len(data)> 196608則永遠掛起。
def call_external_command(command, data):
try:
p = subprocess.Popen(command, stdin=subprocess.PIPE, stdout=subprocess.PIPE, shell=False)
p.stdin.write(data)
except:
return None
else:
return p.communicate()[0]
為什么會有這種限制? 以及如何解決?
太棒了 ! 實際上,我們必須使用communicate()
而不是stdin.write()
:
def call_external_command(command, data):
p = subprocess.Popen(command, stdin=subprocess.PIPE, stdout=subprocess.PIPE, shell=False)
return p.communicate(data)[0]
當oyu發現自己時, .communicate()
處理此問題。
您進行觀察的原因如下:
因此,如果您寫入196608字節,則前65536字節將發送到stdin,由程序讀取,並且(例如,如果它是cat
)輸出到stdout管道。 第二個65536字節放入stdin,由程序讀取並嘗試寫入stdout,但由於stdout已滿而在此處阻塞。 第65536個字節的第三個字節被寫入stdin。 對於每個多余的字節,寫塊是因為stdin也已滿。
解決方案就是您編寫的過程:讓.communicate()
處理整個事情。 根據操作系統的不同,可以通過線程,輪詢或選擇調用為這種情況做好准備並進行處理。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.