`
kanpiaoxue
  • 浏览: 1744777 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

python运行os.system(cmd)的退出问题

 
阅读更多

 

发现之前有人写了一个python的脚本使用os.system(cmd)调用shell。 shell异常结束了,os.system(cmd)也返回非0 ,但是python的退出码是0。

示例代码如下:

#run.sh的内容
#这个命令一定会失败的,因为jar的参数不对。
hadoop jar hello 

 下面是调用这个run.sh的python脚本

#hello.py的内容
import os
os.system('sh run.sh')

 

期望的结果:

运行hello.py ,python内部调用run.sh。由于run.sh里面的hadoop命令失败,sh run.sh会返回非0的错误退出码;然后hello.py会使用这个非零的错误退出码结束程序。

实际的结果:

运行hello.py ,python内部调用run.sh。由于run.sh里面的hadoop命令失败,sh run.sh会返回非0的错误退出码;但是运行python程序hello.py的退出码是0。和预期不符。

问题原因:

原因很简单。看下面的python代码就明白了。

#hello.py的内容
import os
import sys

exit_code = os.system('sh run.sh')
print 'exit_code:%s' % exit_code 
# 这里返回的是非 0 ,因为run.sh运行出现异常返回的就是非0。
# 加入如下代码,让当前python脚本也使用非0退出
if 0 != exit_code:
  sys.exit(1)

如上面代码。  exit_code = os.system('sh run.sh') 里面的 exit_code 因为run.sh 返回非0,但是实际上python的这个函数os.system('sh run.sh')运行是成功的,只不过函数的返回值是非0.这里要区分python脚本运行的退出码和os.system(cmd)的返回值不是一回事,需要根据os.system('sh run.sh')的函数返回值来判断如何让python退出。

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics