使用subprocess通过shell调用另一个模块组件时,需要对返回的code进行判断。判断结果为执行失败时需要raise Exception,不然调用树过于复杂时,我们很难跟踪到异常发生的位置。
sys.exit(1)虽然也可以达到对执行结果进行判断的目的,但是它难于追踪异常发生的位置。
示例如下:
调用树
a.py
`-- b.py
`-- ls
a.py
import sys, subprocess
def exec_cmd(cmd):
"""Run shell command"""
p = subprocess.Popen(cmd,stdin = subprocess.PIPE, \
stdout = subprocess.PIPE,
stderr = subprocess.STDOUT,
shell = True)
log_content = p.communicate()[0]
return p.returncode, log_content
def main():
cmd = "python b.py"
cmd_code, cmd_log = exec_cmd(cmd)
if not cmd_code == 0:
raise Exception(cmd_log)
if __name__ == '__main__':
main()
b.py
import sys, subprocess
def exec_cmd(cmd):
"""Run shell command"""
p = subprocess.Popen(cmd,stdin = subprocess.PIPE, \
stdout = subprocess.PIPE,
stderr = subprocess.STDOUT,
shell = True)
log_content = p.communicate()[0]
return p.returncode, log_content
def main():
cmd = """ls c.py"""
cmd_code, cmd_log = exec_cmd(cmd)
if not cmd_code == 0:
raise Exception(cmd_log)
if __name__ == '__main__':
main()
运行结果
waterforestdeiMac:pythonCrawler waterforest$ python a.py
Traceback (most recent call last):
File "a.py", line 21, in <module>
main()
File "a.py", line 18, in main
raise Exception(cmd_log)
Exception: Traceback (most recent call last):
File "b.py", line 21, in <module>
main()
File "b.py", line 18, in main
raise Exception(cmd_log)
Exception: ls: c.py: No such file or directory
waterforestdeiMac:pythonCrawler waterforest$