我完全意识到相关问题的存在,但所有这些问题都非常模糊,无法清楚地解释每一步都在发生什么。提供的示例通常没有经过测试,也没有提供关于如何使它们适应不同场景的信息。以下是问题以及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
注意:^{icat
处理,终端中的典型图像如下所示:
请纠正我的错误,但这是我目前的理解:
p1.communicate(img.content)
:设置{p1
的STDIN是subprocess.PIPE
,这是{p2
的STDIN是p1
的STDOUT,它是由convert
调整大小的图像。在print
的标准输出,它应该是由icat
提供的ASCII颜色的图像。在问题:
stdin=subprocess.PIPE
和{有人能解释一下这个过程中到底发生了什么,我的代码有什么问题吗?整个管道工程一定比看上去简单,我很想了解它是如何工作的。在
问题1。他们都是
subprocess.PIPE
。。。。在问题2。你不必那样做,你可以很容易做到
(事实上,这正是沟通的一部分在
使用
communicate
是因为它在进程完成之前一直阻塞(在本例中,它的stdout可以用于p2.stdin(也许?))其中aswrite
只需写入管道并继续到文件中python的下一行问题1。无论是
subprocess.PIPE
还是PIPE
,它们引用的是同一个符号,即subprocess
模块中的PIPE
。以下内容相同:问题2。
communicate()
实际上正在将输入发送到p1的STDIN流中。虽然在调用Popen
构造函数时,子进程确实是活动的并在运行,但是在您的特定情况下,convert
实用程序似乎不会做任何事情,除非它通过STDIN真正接收到内容。如果它是一个交互性较差的命令(例如ls
),那么它不会等到communicate()
来做任何事情。在更新内容 在您的例子中,不要使用
^{pr2}$communicate
将输入发送到p1,而是尝试以下方法:看看你运气好不好。在
相关问题 更多 >
编程相关推荐