在python中执行管道shell命令

时间:2017-10-16 11:29:53

标签: python shell subprocess

我需要帮助python代码在python中执行多个管道shell命令。 我写了以下代码,但我收到错误。当我将文件传递给命令时。请告诉我如何在python中执行多个管道命令的正确过程。

EG: cat file|grep -i hostname|grep -i fcid 

是我想要执行的shell命令。这是我的python代码。我运行代码时收到无。我将最终输出重定向到文件。

#!/usr/bin/python3

import subprocess

op = open("text.txt",'w')
file="rtp-gw1"

print("file name is {}".format(file))
#cat file|grep -i "rtp1-VIF"|grep -i "fcid"

#cmd ='cat file|grep -i "rtp1-vif"'
p1  = subprocess.Popen(['cat',file],stdout=subprocess.PIPE, stderr=subprocess.PIPE,shell=True)
p2  = subprocess.Popen(['grep','-i', '"rtp1-vif"',file], stdin=p1.stdout, stdout=subprocess.PIPE,stderr= subprocess.PIPE,shell=Ture)
p1.stdout.close()
p3  = subprocess.Popen(['grep', '-i',"fcid"],stdin=p1.stdout, stdout=op,stderr= subprocess.PIPE,shell=Ture)
p2.stdout.close()

result = p3.communicate()[0]

print(result)

2 个答案:

答案 0 :(得分:0)

你因为这条线而没有得到任何结果:

['grep','-i', '"rtp1-vif"']

这是使用引号传递"rtp1-vif" 字面:不匹配。

请注意,整个管道过程都是过度的。无需使用cat,因为第一个grep可以将文件作为输入。

更进一步,在纯python中执行该任务非常容易。类似的东西:

with open("text.txt",'w') as op:
    file="rtp-gw1"

    for line in file:
        line = line.lower()
        if "rtp1-vif" in line and "fcid" in line:
           op.write(line)

现在您的代码可以在任何平台上运行,而无需发出外部命令。它也可能更快。

答案 1 :(得分:0)

谢谢。我是如何开始的,我有一个超过100,000行的文件。我必须找到每个文件之间缺少的行。我没有得到我想要的结果。这就是我想尝试系统命令的原因,但肯定会尝试while循环。