如何在此处拆分命令以使用subprocess.Popen()

时间:2014-12-17 19:19:17

标签: python command subprocess

ip = subprocess.Popen(["/sbin/ifconfig $(/sbin/route | awk '/default/ {print $8}') | grep \"inet addr\" | awk -F: '{print $2}' | awk \'{print $1}\'"], stdout=subprocess.PIPE)

我不知道在哪里使用逗号分隔它们以使用subprocess.Popen来使用此命令。有谁知道吗?

2 个答案:

答案 0 :(得分:3)

您正在使用shell功能(管道),因此您应该将其作为单个字符串(而不是列表)传递给shell=True

而不是拆分命令。
ip = subprocess.Popen("/sbin/ifconfig $(/sbin/route | awk '/default/ {print $8}') | grep \"inet addr\" | awk -F: '{print $2}' | awk \'{print $1}\'",
    shell=True,
    stdout=subprocess.PIPE)

答案 1 :(得分:0)

这是我的建议。

使用此内容创建一个文件 - 将其命名为' route-info'并使其可执行:

#!/bin/sh

/sbin/ifconfig $(/sbin/route | awk '/default/ {print $8}') |
    grep "inet addr" |
    awk -F: '{print $2}' |
    awk '{print $1}'

在你的python程序中,使用:

ip = subprocess.Popen(["/path/to/route-info"], stdout=subprocess.PIPE)

然后您不必担心引用字符,您可以独立测试route-info脚本以确保其正常工作。

脚本route-info不会接受任何命令行参数,但如果这样做,则会传递它们:

ip = subprocess.Popen(["/path/to/route-info", arg1, arg2, ...], stdout=subprocess.PIPE)