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]