使用来自python的管道执行bash命令

时间:2016-07-14 16:54:14

标签: python command-line output

我想从python中执行bash命令并获取输出:

ifconfig | sed '/^$/d' | awk 'NR > 1 { print $2 }'

我已经尝试过:

p =subprocess.Popen(["ifconfig | sed '/^$/d' | awk 'NR > 1 { print $2 }'"], stdout = PIPE.)
out = p.communicate()

将流程划分为较小的流程:

  

p1和p2并将p1输出传递给p2,但这不起作用

我该怎么办?

1 个答案:

答案 0 :(得分:2)

如果您不想自己划分为多个子流程,那么

shell=True是必要的 - 在这种情况下,您需要一个shell来评估您的命令,将其分解为单独的管道组件,然后启动它们组件。通常情况下,shell会以这种方式对字符串进行解析(您也可以将其传递给数组,但除了第一个条目之外的任何内容都只是shell的额外参数,填充$1,{{1在作为第一个数组条目传递的脚本中的单引号外部使用时,等等:

$2

或者,为了避免需要任何shell,您可以自己连接并启动进程(这是处理不受信任的输入或安全敏感方案时的首选方法;使用shell可能会导致打开您对于Shellshock等安全漏洞:

p = subprocess.Popen("ifconfig | sed '/^$/d' | awk 'NR > 1 { print $2 }'",
                     shell=True, stdout=subprocess.PIPE)