python管道限制为196608(65536*3),带有subprocess.Popen()

python管道限制为196608(65536*3),带有subprocess.Popen(),python,pipe,Python,Pipe,我有这个函数调用外部命令如果len(数据)哦,太棒了!实际上,我们必须使用communicate()而不是stdin.write(): 正如oyu自己发现的那样,.communicate()处理这个问题 您观察的原因如下: 两个管道连接程序和子进程,即其stdin和stdout 根据操作系统的不同,每个管道的缓冲区大小为65536字节 此外,根据程序及其功能,它还读取65536字节并写出一些数据 因此,如果您写入196608个字节,则前65536个字节将发送到stdin,由程序读取,并(例如

我有这个函数
调用外部命令
如果len(数据)哦,太棒了!实际上,我们必须使用
communicate()
而不是
stdin.write()


正如oyu自己发现的那样,
.communicate()
处理这个问题

您观察的原因如下:

  • 两个管道连接程序和子进程,即其stdin和stdout
  • 根据操作系统的不同,每个管道的缓冲区大小为65536字节
  • 此外,根据程序及其功能,它还读取65536字节并写出一些数据
因此,如果您写入196608个字节,则前65536个字节将发送到stdin,由程序读取,并(例如,如果是
cat
)输出到stdout管道。第二个65536字节被放入stdin,由程序读取并尝试写入stdout,但由于stdout已满,它会在那里阻塞。第三个65536字节写入stdin。对于每个多余的字节,都会写入块,因为stdin也已满

解决方案正如您所写:让
.communicate()
处理整个事情。它为这种情况做好了准备,并根据操作系统的线程、轮询或选择调用来处理它。

可能重复的
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]
def call_external_command(command, data):
    p = subprocess.Popen(command, stdin=subprocess.PIPE, stdout=subprocess.PIPE, shell=False)
    return p.communicate(data)[0]