我想在下面的行上使用子进程:
convert ../loxie-orig.png bmp:- | mkbitmap -f 2 -s 2 -t 0.48 | potrace -t 5 --progress -s -o ../DSC00232.svg我发现感谢其他帖子的the subprocess documentation,但在这个例子中我们只使用了两次管道。
因此,我尝试使用这三个命令中的两个命令,它可以正常工作
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]你能帮我做第三个命令吗?
非常感谢。
发布于 2012-03-11 22:47:48
只需按照相同的示例添加第三个命令:
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]发布于 2012-03-12 01:07:22
使用带有shell=True选项的subprocess.Popen(),您可以将整个命令作为单个字符串传递给它。
这是最简单的解决方案,使得在python中嵌入复杂的管道成为可能,而不会让人头疼;但在某些情况下,它可能不起作用,例如(正如@torek所评论的),如果文件名中有空格用于输入或输出。在这种情况下,可以在accepted answer.中构建健壮的解决方案
发布于 2013-04-21 19:34:29
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)然后像这样执行它:
runPipe(['ls -1','head -n 2', 'head -n 1'])https://stackoverflow.com/questions/9655841
复制相似问题