【问题标题】:python subprocess exceptionpython子进程异常
【发布时间】:2017-10-18 09:37:44
【问题描述】:

我将 subprocess.check_output 命令用于两个不同的命令,在一种情况下我得到一个 subprocess.CalledProcessError 而在另一种情况下没有但程序崩溃了。 gpio482文件夹不存在set方法返回错误get方法崩溃

获取捕获异常的方法:

try:
    subprocess.check_output("echo 0 > /sys/class/gpio/gpio482/value", shell=True)
except subprocess.CalledProcessError:
    log("set state failed.")
    return "not-writable"

获取崩溃的方法:

    try:
    state_string = subprocess.check_output("cat /sys/class/gpio/gpio482/value", shell=True)
except subprocess.CalledProcessError:
    log("Get state failed.")
    return "integer", "0" # unknown

有什么地方我做错了吗?!

如果我在 shell 中运行 commonds,我会收到相同的错误消息:

>>> subprocess.check_output("cat /sys/class/gpio/gpio482/value", shell=True)
cat: can't open '/sys/class/gpio/gpio482/value': No such file or directory
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/subprocess.py", line 573, in check_output
raise CalledProcessError(retcode, cmd, output=output)
subprocess.CalledProcessError: Command 'cat /sys/class/gpio/gpio482/value' 
returned non-zero exit status 1
>>> 
>>> 
>>> subprocess.check_output("echo 0 > /sys/class/gpio/gpio482/value", 
shell=True)
/bin/sh: /sys/class/gpio/gpio482/value: No such file or directory
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/subprocess.py", line 573, in check_output
raise CalledProcessError(retcode, cmd, output=output)
subprocess.CalledProcessError: Command 'echo 0 > 
/sys/class/gpio/gpio482/value' returned non-zero exit status 1

【问题讨论】:

  • 你收到了什么错误信息?
  • 如果我在 shell 上尝试这两行,我会得到相同的错误消息。
  • 无法重现你的情况,你确定你的程序处理了CalledProcessError
  • 当 set 方法捕获错误时,我会看到日志消息,但在 get 方法中我没有收到日志消息!
  • 好的,两个子进程调用都是在不同的函数中完成的,当我在两个函数中都调用时,在一个函数中都抛出错误,另一个函数都不会抛出异常。

标签: python subprocess snmp net-snmp


【解决方案1】:

这两个函数如下所示。 set 函数工作正常,我捕获了异常,但在 get 函数中我崩溃了。

def get_uid_light_state():
log("get_uid_light_state")

try:
    state_string = subprocess.check_output("cat /sys/class/gpio/gpio482/value", shell=True)
except subprocess.CalledProcessError:
    log("Get state failed.")
    return "integer", "0" 

if state_string == "1\n":
    return "integer", "2" 
elif state_string == "0\n":
    return "integer", "1" 

def set_uid_light_state(snmptype, state):
if snmptype != "integer":
    return "wrong-type"

if state == "1": 
    cmd_set_state = "echo 0 > /sys/class/gpio/gpio482/value"
elif state == "2":
    cmd_set_state = "echo 1 > /sys/class/gpio/gpio482/value"
else:
    log("Invalid value for set uid light state")
    return "wrong-value"

try:
    subprocess.check_output(cmd_set_state, shell=True)
except subprocess.CalledProcessError:
    log("Set state failed.")
    return "not-writable"

return "DONE"

【讨论】:

    猜你喜欢
    • 2015-10-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-29
    • 2018-04-24
    • 2013-03-18
    • 1970-01-01
    • 2021-05-04
    • 2019-08-15
    相关资源
    最近更新 更多