子进程未运行该命令生成的命令在终端

时间:2017-03-29 05:15:36

标签: python subprocess

cmd= ["sudo", "cat", "{filepath}".format(filepath=filepath), "|","egrep", "-v","\'{filteruser}\'".format(filteruser=filteruser)]

fileformat和filteruser也可以为空白

下面的配置文件
[plugin_haproxy]
user= tara
host=localhost
filepath=/etc/haproxy/haproxy.global.inc
filter=

这是我想在子流程上运行的命令,检查上面的变量值 pdb 显示下面的值并且看起来很棒

['sudo', 'cat', '/etc/haproxy/haproxy.global.inc', '|', 'egrep', '-v', "''"]

Manullay运行代码sudo cat /etc/haproxy/haproxy.global.inc |终端上的egrep -v“''”很棒

为什么子进程无法处理它。

  

“cat:|:没有这样的文件或目录\ ncat:egrep:没有这样的文件或   目录\ NCAT:

3 个答案:

答案 0 :(得分:2)

你的shell将接受一个命令$ a | b | c并将其转换为三个独立的进程(a,b,c),并将一个输出附加到链中下一个的输入。

['sudo', 'cat', '/etc/haproxy/haproxy.global.inc', '|', 'egrep', '-v', "''"]

上面将执行sudo命令(它将依次分叉cat命令并将所有剩余的args传递给cat)。它不懂“|”符号。它只是将它视为另一个arg。是cat抱怨它无法打开“|”,“egrep”等,它将这些文件名视为cat。

您可以使用shell=True尝试Popen。我没有尝试过,也不确定它是否会处理管道。

另一个选项是使用Popen仅执行sudo命令(无过滤器),然后使用Popen.communicate从python中的命令读取输出并在python中执行空行过滤。

编辑: 我快速检查了shell=True。以下是以下脚本:

#!/usr/bin/env python
import subprocess

subprocess.call(["ls", "-l", "|", "cat"], shell=False)
  • 使用shell=False,我收到以下错误:ls: cat: No such file or directoryls: |: No such file or directory。这是预期的,因为ls正在尝试列出|cat的内容。
  • shell=True,我得到了所需的输出。也就是说,ls的输出通过管道传输到cat。 shell正在处理|

答案 1 :(得分:0)

您可以使用已建议的shell=True,也可以使用subprocess来管道:

p1 = subprocess.Popen(['sudo', 'cat', '/etc/haproxy/haproxy.global.inc'], stdout=subprocess.PIPE)
p2 = subprocess.Popen(['egrep', '-v', "''"], stdin=p1.stdout,stdout=subprocess.PIPE)

答案 2 :(得分:0)

命令和过滤

command = ["sudo", "cat", "{filepath}".format(filepath=filepath)]         
userfilter = ["egrep", "-v", "\"{filteruser}\"".format(filteruser=filteruser)***]

<强>子过程

cmdout = subprocess.Popen(command, stdout=subprocess.PIPE)
filtration = subprocess.Popen(runfilter, stdin=cmdout.stdout,stdout=subprocess.PIPE)

output, err = filtration.communicate()

是的,我使用了两个步骤的解决方案,在这里找不到一个最好的参考,Python subprocess command with pipe