从Python脚本管理shell命令结果

时间:2016-04-18 13:08:19

标签: python shell error-handling subprocess

python脚本运行此命令:

return_code = call("iw wlan0 scan | sed -e 's#(on wlan# (on wlan#g' | awk -f scan.awk > scan.txt", shell=True)

我只想在命令运行良好的情况下继续我的代码。但是,即使命令失败,return_code总是" 0&#34 ;.

更确切地说,失败由

表示
command failed: Device or resource busy (-16)

我怎样才能捕获"这条消息并避免程序继续?如果"命令失败"错误,我想重复shell命令,但我不知道该怎么做。

2 个答案:

答案 0 :(得分:0)

你可以这样做:

import subprocess

cmd = "iw wlan0 scan | sed -e 's#(on wlan# (on wlan#g' | awk -f scan.awk > scan.txt"
cmd_err = "command failed: Device or resource busy"
output = cmd_err

while cmd_err in output:
    # maybe add a delay and a "max no. of retries" counter
    output = subprocess.check_output(cmd, shell=True)

# success - rest of your code

我不能写shell=True而不提及使用它带来了某些安全风险(代码/命令注入)。尽可能避免使用它,永远不要将它用于不受信任的输入。

答案 1 :(得分:0)

这取决于您希望得到结果的命令部分。你应该得到的是(我认为 - 现在自己学习这些东西)" awk -f scan.awk>的返回代码。 scan.txt&#34 ;.

我怀疑你真正想要的是根据" iw wlan0 scan"的结果继续使用sed / awk组件,所以将它分成2个部分来进行扫描,检查结果,如果返回码为0 /输出不是"命令失败,则继续:设备或资源忙"。

我喜欢提供一个语法和程序上完美的例子来说明如何做到这一点,但我也只是学习:)