怎么办子流程.Popen管道在Python中工作?

2024-05-14 19:45:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我完全意识到相关问题的存在,但所有这些问题都非常模糊,无法清楚地解释每一步都在发生什么。提供的示例通常没有经过测试,也没有提供关于如何使它们适应不同场景的信息。以下是问题以及Python的文档:

这基本上就是我要实现的,但是在Python中:

curl http://asdf.com/89asdf.gif | convert -resize 80x80 - - | icat -k -

以下是我在《科学怪人》课余时间里所得到的关于上述答案的一部分:

^{pr2}$

这是我的代码,这次根据您的回答进行了改进:

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

注意:^{}在256个彩色终端中输出图像。我已经成功地在another question中打印了它的输出。一旦被icat处理,终端中的典型图像如下所示:

icat doing what it does best

请纠正我的错误,但这是我目前的理解:

  • p1.communicate(img.content):设置{}的STDIN。在
  • p1的STDIN是subprocess.PIPE,这是{}提供的。在
  • p2的STDIN是p1的STDOUT,它是由convert调整大小的图像。在
  • 然后我print的标准输出,它应该是由icat提供的ASCII颜色的图像。在

问题:

  1. 我看过stdin=subprocess.PIPE和{}。有什么区别?在
  2. 为什么在定义其他子流程之后提供第一个STDIN?在

有人能解释一下这个过程中到底发生了什么,我的代码有什么问题吗?整个管道工程一定比看上去简单,我很想了解它是如何工作的。在


Tags: 图像httpconvertimgstdinstdoutsubprocesspopen
2条回答

问题1。他们都是subprocess.PIPE。。。。在

问题2。你不必那样做,你可以很容易做到

p1.stdin.write(img.content)

(事实上,这正是沟通的一部分在

使用communicate是因为它在进程完成之前一直阻塞(在本例中,它的stdout可以用于p2.stdin(也许?))其中aswrite只需写入管道并继续到文件中python的下一行

问题1。无论是subprocess.PIPE还是PIPE,它们引用的是同一个符号,即subprocess模块中的PIPE。以下内容相同:

# Version 1
import subprocess
proc = subprocess.Popen(['ls'], stdout=subprocess.PIPE)
output = proc.communicate()[0]

# Version 2
from subprocess import PIPE, Popen
proc = Popen(['ls'], stdout=PIPE)
output = proc.communicate()[0]

问题2。communicate()实际上正在将输入发送到p1的STDIN流中。虽然在调用Popen构造函数时,子进程确实是活动的并在运行,但是在您的特定情况下,convert实用程序似乎不会做任何事情,除非它通过STDIN真正接收到内容。如果它是一个交互性较差的命令(例如ls),那么它不会等到communicate()来做任何事情。在

更新内容 在您的例子中,不要使用communicate将输入发送到p1,而是尝试以下方法:

^{pr2}$

看看你运气好不好。在

相关问题 更多 >

    热门问题