Python:管道请求图像参数为stdin

我正在尝试将参数发送到子进程的标准输入。 在我的情况下,它是一个与Requsts一起下载的图像。

这是我的代码:

from subprocess import Popen, PIPE, STDOUT
img = requests.get(url, stream=True)
i = img.raw.read()
proc = subprocess.Popen(['icat', '-'], stdout=PIPE, stdin=PIPE, stderr=STDOUT)
proc.communicate(i)
#proc.stdin.write(i) # I tried this too

不幸的是,子进程没有任何作用,我也没有任何错误。 我的代码出了什么问题,是否有跨平台的解决方案?


icat查询您的终端以查看调整图像大小的尺寸,但是管道不适合作为终端,并且最终输出为空。 来自icat的帮助信息指出:

大图像会自动调整到您的终端宽度,除非使用-k选项。

当你使用-k开关输出时产生。

没有必要在这里进行流式处理,您可以将加载保留为requests并传入响应主体,解码为:

img = requests.get(url)
proc = subprocess.Popen(['icat', '-k', '-'], stdout=PIPE, stdin=PIPE, stderr=STDOUT)
stdout, stderr = proc.communicate(img.content)

stderr值将为空,但stdout应包含转换后的图像数据(ANSI颜色转义):

>>> import requests
>>> import subprocess
>>> url = 'https://www.gravatar.com/avatar/24780fb6df85a943c7aea0402c843737'
>>> img = requests.get(url)
>>> from subprocess import PIPE, STDOUT
>>> proc = subprocess.Popen(['icat', '-k', '-'], stdout=PIPE, stdin=PIPE, stderr=STDOUT)
>>> stdout, stderr = proc.communicate(img.content)
>>> len(stdout)
77239
>>> stdout[:20]
'x1b[38;5;15mx1b[48;5;15m'
链接地址: http://www.djcxy.com/p/77093.html

上一篇: Python: piping Requests image argument to stdin

下一篇: Using subprocess for socat in Python