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:
答案 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 directory
和ls: |: 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