Python:piping请求图像参数到stdin

时间:2014-11-17 19:32:15

标签: python arguments pipe stdin python-requests

我正在尝试将参数发送到子进程'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

不幸的是,子进程什么都不做,我没有错误。我的代码有什么问题,是否有跨平台的解决方案?

1 个答案:

答案 0 :(得分:1)

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;15m\x1b[48;5;15m'