Python执行Shell命令无法获取返回值的排查与解决
本文解决Python脚本中执行Shell命令无法获取返回值的问题。通过对比os.popen、subprocess和commands模块,分析因环境变量缺失导致命令未找到的原因,并给出使用绝对路径执行非系统自带工具(如supervisorctl)的解决方案。
问题背景与现象
在利用Python获取服务器中supervisor状态信息时,发现程序未能正确获取到预期的返回值。
Python获取Shell命令结果的常用方法
Python中获取Shell命令执行结果的常见方式主要有以下几种。
# 1.os模块
ret = os.popen("supervisorctl status")
ret_data = ret.read()
# 2.subprocess模块
ret = subprocess.Popen('supervisorctl status',shell=True,stdout=subprocess.PIPE)
out,err = ret.communicate()
# 3.commands模块
ret_data = commands.getoutput("supervisorctl status")
# commands.getstatusoutput()还可获取到命令执行是否成功状态
常见错误排查与路径解决方案
最初程序采用方法,在交互式Python Shell或IDE环境中运行正常,但在脚本模式下执行时返回值为空。随后尝试改用方法,此时获取到的返回值提示“sh: supervisorctl: command not found”,表明命令未被识别。
上述错误说明执行环境无法直接识别supervisorctl命令。尽管系统中已安装该工具,但通过查询其实际路径后,改用绝对路径“/usr/local/bin/supervisorctl status”执行指令,最终成功获取到返回值。
解决方案总结
总结上述排查过程,
当Python调用Shell命令操作非系统自带工具时,建议明确指定工具的完整路径,以避免因环境变量配置问题导致的命令未找到错误。
判断命令执行成功的技巧
补充知识:Python中判断系统命令执行是否成功的方法。
首先需要了解如何调用系统命令并判断其状态。
>>> os.system('ls')
anaconda-ks.cfg install.log.syslog 模板 图片 下载 桌面
install.log 公共的 视频 文档 音乐
0
>>>
>>> os.system('lss')
sh: lss: command not found
32512
>>>
第一种方式是通过肉眼观察返回值:正确的命令通常返回0,而错误的命令则返回非0值。
第二种方式是利用if语句判断返回值是否为0。若返回值为0,则不输出任何内容;若不为0,则输出“Without the command”提示。
以下是执行错误命令时的输出示例。
>>> if os.system('lss') !=0:print 'Without the command'
...
sh: lss: command not found
Without the command
以下是执行正确命令时的输出示例。
>>> if os.system('ls') !=0:print 'Without the command'
...
anaconda-ks.cfg install.log.syslog 模板 图片 下载 桌面
install.log 公共的 视频 文档 音乐
>>>
以上关于解决Python执行Shell命令无法获取返回值的问题分享完毕,希望能为读者提供参考。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













