Python:piping向stdin请求图像参数

Python:piping向stdin请求图像参数,python,arguments,pipe,stdin,python-requests,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

我正在尝试将参数发送到子进程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的帮助信息说明:

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

使用
-k
开关时,会产生输出

此处无需流式处理,您只需将加载留给
请求
,然后传入响应正文,未解码:

img = requests.get(url)
proc = subprocess.Popen(['icat', '-k', '-'], stdout=PIPE, stdin=PIPE, stderr=STDOUT)
stdout, stderr = proc.communicate(img.content)
stderr
值将为空,但
stdout
应包含转换后的图像数据(ANSI颜色转义):


实际上,这里没有任何流媒体,所以您可以使用
img.content
。您还忽略了
proc
的输出。我正在使用它,但图像仍然没有显示。@octosquidopus:该命令需要一个合适的终端。管道不是合适的终端。@octosquidopus:hrm,我可能对这里的
icat
不正确;我看到他们还提供了
>imagedata.txt
选项。但是,我在使用
cat-
通过子流程传输图像时没有问题。真的吗?真倒霉在这种情况下,我想你已经回答了我最初的问题,我感谢你提供了一个清晰的示例,但是有没有一种方法可以与Python一起使用?@octosquidopus:BTW,我发现当你使用
icat-
时,图像数据是;IIRC你想避免那样。
>>> 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'