python subprocess.check_output returns 某些命令出现 CalledProcessError
python subprocess.check_output returns CalledProcessError on some commands
>>> 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 命令可以正常工作,但是 returns sdb 会出错吗? sdc 也有效,为了记录。另外,我知道使用 shell=True 的风险。我在编写测试脚本时正在学习 python 和 运行 解决这个问题。
要了解输出和错误,请使用
import subprocess
c=subprocess.Popen("smartctl -d ata -a /dev/sdb",stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=True)
output,error=c.communicate()
#now check your error or output
你可以很容易地看出 sdb 出了什么问题:
try:
subprocess.check_output("smartctl -d ata -a /dev/sdb", shell=True)
except subprocess.CalledProcessError, e:
print e.output
smartctl
命令returns值64。根据manual page,return值是一个位域。
将 64 转换为二进制产生 01000000,因此第 6 位被设置(最右边的位是第 0 位)。根据上述联机帮助页:
Bit 6:
The device error log contains records of errors.
如果可以使用 Python 3.5,则可以使用新的 high-level API subprocess.run()
。这允许您同时捕获 return 值和标准 output/error.
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)
>>> 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 命令可以正常工作,但是 returns sdb 会出错吗? sdc 也有效,为了记录。另外,我知道使用 shell=True 的风险。我在编写测试脚本时正在学习 python 和 运行 解决这个问题。
要了解输出和错误,请使用
import subprocess
c=subprocess.Popen("smartctl -d ata -a /dev/sdb",stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=True)
output,error=c.communicate()
#now check your error or output
你可以很容易地看出 sdb 出了什么问题:
try:
subprocess.check_output("smartctl -d ata -a /dev/sdb", shell=True)
except subprocess.CalledProcessError, e:
print e.output
smartctl
命令returns值64。根据manual page,return值是一个位域。
将 64 转换为二进制产生 01000000,因此第 6 位被设置(最右边的位是第 0 位)。根据上述联机帮助页:
Bit 6: The device error log contains records of errors.
如果可以使用 Python 3.5,则可以使用新的 high-level API subprocess.run()
。这允许您同时捕获 return 值和标准 output/error.
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)