【问题标题】:Python: piping Requests image argument to stdinPython:将请求图像参数传递给标准输入
【发布时间】:2015-01-14 19:46:40
【问题描述】:

我正在尝试将参数发送到子进程的标准输入。就我而言,它是使用请求下载的图像。

这是我的代码:

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

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

【问题讨论】:

  • 您实际上并没有在此处流式传输任何内容,因此您可以使用img.content。您也忽略了来自proc输出

标签: python arguments pipe stdin python-requests


【解决方案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'

【讨论】:

  • 我正在使用这个icat,但图像仍然没有显示。
  • @octosquidopus:该命令需要合适的终端。管道不是合适的终端。
  • @octosquidopus: hrm,这里我可能对icat 有误;我看到他们还提供> imagedata.txt 选项。不过,我使用cat - 通过子进程传送图像没有问题。
  • 真的吗?真可惜。在这种情况下,我想你已经回答了我最初的问题,我感谢你提供了一个清晰的例子,但是有没有办法在 Python 中使用icat
  • @octosquidopus:顺便说一句,我看到当你使用icat -时,图像数据是written to a temporary file; IIRC 你想避免这种情况。
猜你喜欢
  • 2016-04-09
  • 1970-01-01
  • 2018-02-27
  • 2016-04-21
  • 2016-08-21
  • 1970-01-01
  • 1970-01-01
  • 2018-11-28
  • 2012-06-05
相关资源
最近更新 更多