当前位置: 首页 > 面试题库 >

子进程stdin缓冲区未在bufsize = 1的换行符上刷新

秦才
2023-03-14
问题内容

我有两个小python文件,第一个使用读取一行input,然后打印另一行

a = input()
print('complete')

第二次尝试将其作为子进程运行

import subprocess

proc = subprocess.Popen('./simp.py',
                        stdout=subprocess.PIPE,
                        stdin=subprocess.PIPE,
                        bufsize=1)
print('writing')
proc.stdin.write(b'hey\n')
print('reading')
proc.stdout.readline()

上面的脚本将先打印“写作”,然后显示“阅读”,然后挂起。起初我以为这是一个标准输出缓冲的问题,所以我换bufsize=1bufsize=0了,这确实解决问题。但是,似乎是标准输入引起了问题。

使用bufsize=1,如果我proc.stdin.flush()在写入下面添加,则过程继续。这两种方法都显得笨拙,因为(1)无缓冲的流很慢(2)在所有地方添加刷新都很容易出错。为什么上面的代码write不能在换行符上刷新?文档说这bufsize是在为子流程创建stdin,stdout和stderr流时使用的,那么是什么导致写操作不在换行符上刷新呢?


问题答案:

从文档中:
1表示行缓冲(仅当Universal_newlines = True,即在文本模式下可用)”
。这有效:

import subprocess

proc = subprocess.Popen('./simp.py',
                        stdout=subprocess.PIPE,
                        stdin=subprocess.PIPE,
                        bufsize=1,
                        universal_newlines=True)

print('writing')
proc.stdin.write('hey\n')
print('reading')
proc.stdout.readline()


 类似资料:
  • 问题内容: 有人可以保存这两个文件并运行它们,然后告诉我为什么我得到错误“ ob_flush()[ref.outcontrol]:无法刷新缓冲区。没有要刷新的缓冲区”。我尝试了四处搜寻,并说必须使用ob_start();。但是,当我这样做时,它不会逐行打印出来,而是在完成后从FOR循环返回整个对象。我对PHP有点陌生,所以我不确定其他地方。 test_process.php main.html 问

  • 问题内容: 我有 第3行出现错误类型Str不支持缓冲区API。 我在做错什么我在Python 3.3上 问题答案: 您正在读取二进制数据,而不是,因此您需要先解码输出。如果将参数设置为,则使用方法的结果自动解码 (与打开文本文件相同): 如果您使用Python 3.6或更高版本,则可以对调用使用显式参数,以指定要使用的其他编解码器,例如UTF-8: 如果您需要在Python 3.5或更早版本中使用

  • 我正在阅读有关流的信息,发现我们可以使用setvbuf()函数来控制流......它写的是在行缓冲模式中,当遇到换行符时流将数据发送到文件中,在无缓冲状态下没有缓冲......所以我写了以下代码...... 所以我认为,因为这些是无缓冲流,所以输入应该在我写入屏幕后立即发送到标准输出。。。但程序在写入每一行后等待我按enter键,然后屏幕上只显示输出(由于fwrite)。。。我的问题是,当这些是无

  • 我正在使用流协议编写服务器,所以我需要做一些事情,比如找到标题的结尾,复制它,然后在提升缓冲区中解析其他东西。当我发现使用字符串操作的最佳方法(在其中找到字符串,使用迭代器复制/删除等等)是std::字符串。但是我使用的是char数组缓冲区。所以我需要有两个缓冲区——char数组和std::字符串——每次我需要使用缓冲区进行操作时,我需要将char数组转换为std::字符串,完成我的工作,然后使用

  • 问题内容: 在Python中,您可以将StringIO用作字符数据的文件状缓冲区。内存映射文件基本上对二进制数据执行类似的操作,但是它需要一个用作基础的文件。Python是否有一个用于二进制数据且仅是内存的文件对象,相当于Java的ByteArrayOutputStream? 我的用例是我想在内存中创建一个ZIP文件,而ZipFile需要一个类似文件的对象。 问题答案: 您可能正在寻找io.Byt

  • 我有一个二进制数据缓冲区,我想存储在协议缓冲区中。 在留档(https://developers.google.com/protocol-buffers/docs/proto#scalar)中,它说类型等价于C中的。我无法相信这一点,所以我不得不尝试它,是的,这似乎是这样... 本协议: 给出一个包含以下内容的消息定义: 公共setter/getter API如下所示: 当然,这不是在消息中存储二