首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python子进程:如何三次使用管道?

Python子进程:如何三次使用管道?
EN

Stack Overflow用户
提问于 2012-03-11 22:35:28
回答 3查看 16.8K关注 0票数 15

我想在下面的行上使用子进程:

代码语言:javascript
复制
convert ../loxie-orig.png bmp:- | mkbitmap -f 2 -s 2 -t 0.48 | potrace -t 5 --progress -s -o ../DSC00232.svg

我发现感谢其他帖子的the subprocess documentation,但在这个例子中我们只使用了两次管道。

因此,我尝试使用这三个命令中的两个命令,它可以正常工作

代码语言:javascript
复制
p1 = subprocess.Popen(['convert', fileIn, 'bmp:-'], stdout=subprocess.PIPE)
# p2 = subprocess.Popen(['mkbitmap', '-f', '2', '-s', '2', '-t', '0.48'], stdout=subprocess.PIPE)
p3 = subprocess.Popen(['potrace', '-t' , '5', '-s' , '-o', fileOut], stdin=p1.stdout,stdout=subprocess.PIPE)
p1.stdout.close()  # Allow p1 to receive a SIGPIPE if p3 exits.
output = p3.communicate()[0]

你能帮我做第三个命令吗?

非常感谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-03-11 22:47:48

只需按照相同的示例添加第三个命令:

代码语言:javascript
复制
p1 = subprocess.Popen(['convert', fileIn, 'bmp:-'], stdout=subprocess.PIPE)
p2 = subprocess.Popen(['mkbitmap', '-f', '2', '-s', '2', '-t', '0.48'], 
     stdin=p1.stdout, stdout=subprocess.PIPE)
p1.stdout.close()
p3 = subprocess.Popen(['potrace', '-t' , '5', '-s' , '-o', fileOut],        
     stdin=p2.stdout,stdout=subprocess.PIPE)
p2.stdout.close()

output = p3.communicate()[0]
票数 29
EN

Stack Overflow用户

发布于 2012-03-12 01:07:22

使用带有shell=True选项的subprocess.Popen(),您可以将整个命令作为单个字符串传递给它。

这是最简单的解决方案,使得在python中嵌入复杂的管道成为可能,而不会让人头疼;但在某些情况下,它可能不起作用,例如(正如@torek所评论的),如果文件名中有空格用于输入或输出。在这种情况下,可以在accepted answer.中构建健壮的解决方案

票数 4
EN

Stack Overflow用户

发布于 2013-04-21 19:34:29

代码语言:javascript
复制
def runPipe(cmds):
try: 
    p1 = subprocess.Popen(cmds[0].split(' '), stdin = None, stdout = subprocess.PIPE, stderr = subprocess.PIPE)
    prev = p1
    for cmd in cmds[1:]:
        p = subprocess.Popen(cmd.split(' '), stdin = prev.stdout, stdout = subprocess.PIPE, stderr = subprocess.PIPE)
        prev = p
    stdout, stderr = p.communicate()
    p.wait()
    returncode = p.returncode
except Exception, e:
    stderr = str(e)
    returncode = -1
if returncode == 0:
    return (True, stdout.strip().split('\n'))
else:
    return (False, stderr)

然后像这样执行它:

代码语言:javascript
复制
runPipe(['ls -1','head -n 2', 'head -n 1'])
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9655841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档