python - 子进程打开缓冲区大小
问题描述
如何设置弹出缓冲区的大小或清除它?我有两个脚本:ty2.py 只打印两次
#import sys
a, b = b'123', '123'
print(a)
print(b)
#print(sys.getsizeof(a)) #36
#print(sys.getsizeof(b)) #52
和 t1.py 使用 popen 调用 t2.py 脚本
import subprocess as sp
#pipe = sp.Popen(['stdbuf', '-o0', '-i0', '-e0', 'python3', '-u', 't2.py'], stdout=sp.PIPE, bufsize=2, universal_newlines=True)
pipe = sp.Popen(['python3', 't2.py'], stdout=sp.PIPE, bufsize=2)
#pipe.stdout.flush() #also doesn't work
print(pipe.stdout.read())
输出:b"b'123'\n123\n"
我的数据应该是实时的,我只需要输出最后一次打印。可能吗?如果我将 bufsize 设置为 0、1、2 甚至 200,则没有区别:它读取两个打印件(我知道,0 表示没有缓冲区,但我看到的是完全缓冲)。我需要限制它。stdbuf 和 -u 也不起作用。
解决方案
如果您真的只想要最后一次打印,您可以尝试:
pipe = subprocess.Popen([<YOUR COMMANDS>], stdout=subprocess.PIPE, shell=True,
universal_newlines=True).communicate()[0]
print(pipe.rstrip().split('\n')[-1])
时universal_newlines=True
,流为文本流,否则为字节流。我不确定你是否想要那个选项。
推荐阅读
- .htaccess - .htaccess 如何使用查询字符串重定向虚假链接
- javascript - 如果我根据前 3 个 id 选择 1 或 2 或 3,我在一个 div 中有五个 6 个复选框,其他 3 个复选框应该被禁用,我的意思是 4,5 和 6
- c# - 如何从 .NET 调用 luasql 脚本
- c++ - Google 语音识别(cpp 示例):未定义对 AssignDescriptors() 的引用
- c++ - 模板 Cast-Operator 规范
- hadoop - 我们可以检查 hive 删除表的历史记录或它周围的详细信息吗?
- node.js - 一个进程的标准输出到nodejs中另一个(ffmpeg)的标准输入
- c# - ServicePartitionResolver.ResolveAsync 永远挂起
- elasticsearch - ElasticSearch 中的英语分析器(词干)不起作用
- azure-devops - Azure DevOps 发布管道中的计数器