【发布时间】:2015-02-08 02:07:27
【问题描述】:
我完全知道相关问题的存在,但所有这些问题都非常模糊,无法清楚地说明每一步发生了什么。提供的示例通常未经测试,也没有提供有关如何使它们适应不同场景的信息。以下是问题以及 Python 的文档:
- How do I use subprocess.Popen to connect multiple processes by pipes?
- link several Popen commands with pipes
- https://docs.python.org/2/library/subprocess.html#popen-objects
这本质上是我想要实现的,但是在 Python 中:
curl http://asdf.com/89asdf.gif | convert -resize 80x80 - - | icat -k -
以下是我在下班后将上述答案的部分和部分整理在一起的内容:
import requests
import subprocess
from subprocess import Popen, PIPE, STDOUT
url = 'http://asdf.com/89asdf.gif'
img = requests.get(url)
p1 = subprocess.Popen(['convert', '-resize', '80x80', '-', '-'], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
p2 = subprocess.Popen(['icat', '-k', '-'], stdin=p1.stdout, stdout=subprocess.PIPE)
p1.communicate(img.content)
print p2.stdout
这是我的代码,这次根据您的回答进行了改进:
import requests
from subprocess import Popen, PIPE, STDOUT
url = 'http://asdf.com/89asdf.gif'
img = requests.get(url)
p1 = Popen(['convert', '-resize', '80x80', '-', '-'], stdin=PIPE, stdout=PIPE)
p2 = Popen(['icat', '-k', '-'], stdin=p1.stdout, stdout=PIPE)
p1.stdin.write(img.content)
p1.stdin.close()
p1.stdout.close()
output = p2.communicate()[0]
print output
注意:icat 在支持 256 色的终端中输出图像。我已经设法在another question 中成功打印了它的输出。 icat 处理后的典型图像在终端中如下所示:
请纠正我的错误,但这是我目前的理解:
-
p1.communicate(img.content):这设置了p1的 STDIN。 -
p1的 STDIN 是subprocess.PIPE,这是p1.communicate(mg.content)提供的。 -
p2的STDIN是p1的STDOUT,也就是convert调整大小的图片。 - 然后我
printp2的STDOUT,应该是icat提供的ASCII颜色的图片。
问题:
-
stdin=subprocess.PIPE和stdin=PIPE我都见过。有什么区别? - 为什么在定义其他子流程之后才提供第一个 STDIN?
有人能解释一下这个过程中实际发生了什么以及我的代码有什么问题吗?整个管道业务一定比看起来简单,我很想了解它是如何运作的。
【问题讨论】:
-
抱歉,我只是仔细查看了您的代码 - 我昨天一定是太累了。对我的答案进行了编辑,可能会有所帮助。
标签: python python-2.7 subprocess