Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中使用Popen调用管道命令_Python_Unix_Subprocess - Fatal编程技术网

在Python中使用Popen调用管道命令

在Python中使用Popen调用管道命令,python,unix,subprocess,Python,Unix,Subprocess,调用包含多个管道的命令到Popen以便读取其输出的正确方法是什么?我试过: Popen(shlex.split(“mycmd arg1 | mysecondcmd-| thirdcmd-”,stdout=PIPE)”) 但是我不相信这里有shlex.split。正确的语法是什么?您有一些选择--您可以传递shell=True: Popen('command1 | command2 | command3',shell=True) 或者,您可以将其分解为一组Popen调用,将其stdout连接到下

调用包含多个管道的命令到
Popen
以便读取其输出的正确方法是什么?我试过:

Popen(shlex.split(“mycmd arg1 | mysecondcmd-| thirdcmd-”,stdout=PIPE)”)

但是我不相信这里有
shlex.split
。正确的语法是什么?

您有一些选择--您可以传递
shell=True

Popen('command1 | command2 | command3',shell=True)
或者,您可以将其分解为一组
Popen
调用,将其stdout连接到下一个Popen的stdin,如中所示。使用,pipes been function composition:

import sh
output = sh.thirdcmd(sh.mysecondcmd(sh.mycmd("arg1")))

如果要在不使用
shell=True
的情况下使用子进程执行此操作,则有一个示例显示如何使用
subprocess.Popen
编写shell管道。请注意,您应该关闭
proc.stdout
s,以便可以正确接收
SIGPIPE
s:

import subprocess
proc1 = subprocess.Popen(shlex.split('mycmd arg1'), stdout = subprocess.PIPE)
proc2 = subprocess.Popen(shlex.split('mysecondcmd'), stdin = proc1.PIPE,
                         stdout = subprocess.PIPE)
proc3 = subprocess.Popen(shlex.split('thirdcmd'), stdin = proc2.PIPE,
                         stdout = subprocess.PIPE)

# Allow proc1 to receive a SIGPIPE if proc2 exits.
proc1.stdout.close()
# Allow proc2 to receive a SIGPIPE if proc3 exits.
proc2.stdout.close()
out, err = proc3.communicate()

这看起来可能比使用
shell=True
要做的工作多得多。您可能希望避免使用
shell=True
的原因是(向下翻页到“警告”框),尤其是如果您正在运行由提供的命令(可能是恶意的)用户。

一方面,您将
stdout=PIPE
作为参数传递给
shlex.split
,而不是传递给
Popen
构造函数。另一方面,您有奇数个
字符;大概这是最后一个无关的。此外,如果要使用shell功能,必须传递
shell=True
。(您通常不希望生成一个shell来将命令管道连接在一起,但如果愿意,您可以。)的可能重复