>>> 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并在编写测试脚本时遇到了这个问题。
答案 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)