python subprocess.check_output在某些命令

时间:2016-01-19 20:26:25

标签: python exception subprocess

>>> import subprocess
>>> subprocess.check_output("smartctl -d ata -a /dev/sda", shell=True)
"output of above command prints normally"
>>> subprocess.check_output("smartctl -d ata -a /dev/sdb", shell=True)
Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    File "/usr/lib/python2.7/subprocess.py", line 544, in check_output
       raise CalledProcessError(retcode, cmd, output=output)
subprocess.CalledProcessError: Command 'smartctl -d ata -a /dev/sdb' returned non-zero exit status 64

任何人都可以向我解释为什么上面的命令与sda工作正常,但返回错误与sdb? sdc也适用于记录。另外,我知道使用shell = True的风险。我正在学习python并在编写测试脚本时遇到了这个问题。

3 个答案:

答案 0 :(得分:2)

您可以轻松查看sdb的错误:

=LARGE(INDIRECT("Data!" & ADDRESS(44,MATCH(Sheet1!$B$5,Data!$3:$3,0)) & ":" & ADDRESS(65,MATCH(Sheet1!$B$5,Data!$3:$3,0))),1)

答案 1 :(得分:1)

要了解输出和错误,请使用

typename

答案 2 :(得分:1)

smartctl命令返回值64.根据manual page,返回值是位域。 将64转换为二进制产生01000000,因此设置位6(最右边的位是位0)。根据上述手册:

  

第6位:           设备错误日志包含错误记录。

如果您可以使用Python 3.5,则可以使用新的高级API subprocess.run()。这允许您捕获返回值和标准输出/错误。

prog = ['smartctl',  '-d', 'ata', '-a',  '/dev/sda']
result = subprocess.run(prog, stdout=subprocess.PIPE,
                        stderr=subprocess.PIPE)
if result.returncode == 0:
    print(result.stdout)
else:
   print('smartctl returned error', result.returncode)