【问题标题】:Subprocess popen buffer size子进程打开缓冲区大小
【发布时间】:2018-07-03 14:21:22
【问题描述】:

如何设置弹出缓冲区的大小或清除它?我有两个脚本: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 也不起作用。

【问题讨论】:

  • 您真的希望输出为字节类型吗?
  • @GuiGWR 是的,我需要将其转换为 numpay 数组。数据是原始图像。

标签: python python-3.x subprocess buffer popen


【解决方案1】:

如果你真的只想要最后一张,你可以试试:

   pipe = subprocess.Popen([<YOUR COMMANDS>], stdout=subprocess.PIPE, shell=True, 
   universal_newlines=True).communicate()[0]

   print(pipe.rstrip().split('\n')[-1])

universal_newlines=True时,流为文本流,否则为字节流。我不确定你是否想要那个选项。

【讨论】:

  • 问题是我得到一个原始图像,所以我以字节为单位。因此它不是行分隔的。另外我需要实时读取,所以进程必须在运行。
  • 我不明白你问题中的那句话:“我的数据应该是实时的,我只需要输出最后一次打印”。你的意思是你只想要print(b) 部分?
  • GuiGWR 不,这个案例只是我遇到的问题的一个简单例子。在我的真实应用程序中,我得到原始字节,而不是行分隔的字符串
猜你喜欢
  • 2020-09-05
  • 2014-06-10
  • 1970-01-01
  • 2015-06-28
  • 1970-01-01
  • 1970-01-01
  • 2011-11-26
  • 2021-09-18
  • 2012-04-11
相关资源
最近更新 更多