簡體   English   中英

帶有subprocess.Popen()的python管道限制為196608(65536 * 3)

[英]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()處理此問題。

您進行觀察的原因如下:

  • 兩個管道連接程序和子進程,即其stdin和其stdout。
  • 根據操作系統的不同,每個管道的緩沖區大小為65536字節。
  • 此外,根據程序及其功能,它還讀取65536字節並寫出一些數據。

因此,如果您寫入196608字節,則前65536字節將發送到stdin,由程序讀取,並且(例如,如果它是cat )輸出到stdout管道。 第二個65536字節放入stdin,由程序讀取並嘗試寫入stdout,但由於stdout已滿而在此處阻塞。 第65536個字節的第三個字節被寫入stdin。 對於每個多余的字節,寫塊是因為stdin也已滿。

解決方案就是您編寫的過程:讓.communicate()處理整個事情。 根據操作系統的不同,可以通過線程,輪詢或選擇調用為這種情況做好准備並進行處理。

暫無
暫無

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

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