在Python 2或3中,如何同时获取系统调用的返回码和返回字符串?

时间:2017-11-03 20:15:17

标签: python python-2.7 python-3.x

我知道我可以这样做来执行一个系统命令,例如make,它会给我一个0表示成功,或者一个非零表示失败。

import os
result = os.system('make')

我也知道我可以这样做,所以我可以看到命令的返回字符串

import commands
result = commands.getoutput('make')

如何同时完成两者,返回代码和返回字符串结果,然后我就可以

if return_code > 0:
  print(return_string)

感谢。

2 个答案:

答案 0 :(得分:4)

使用Python运行内容的规范方法是使用onClickListener模块,但它有一大堆神秘的函数称为subprocesscheck_call,这些函数往往含有神秘色彩警告如"不要使用stdout = PIPE或stderr = PIPE使用此功能",所以让我提供更多:

第1步:运行脚本

check_output

现在,该进程正在后台运行,您可以参考它。

编辑:我差点忘了 - 如果您想稍后检索输出,您必须告诉Python为标准输出创建读取管道。如果您不执行此步骤,stdout和stderr将只执行您的程序的标准输出和标准错误,并且proc = subprocess.Popen(["your_command", "parameter1", "paramter2"], stdout=subprocess.PIPE, stderr=subprocess.PIPE) 不会在步骤2中接收它们。

第2步:等待进程完成并获得其输出

communicate

communicate也可以让你做更多的事情:

  • 将stdin数据传递给进程(stdout, sterr = proc.communicate() return_code = proc.returncode 参数)
  • 给出完成过程的时间限制,以避免挂起(input=参数)

确保同时捕捉并妥善处理来自Popencommunicate的任何例外情况。

如果你不关心旧的Python,那就是一个更简单的方法subprocess.run,它可以做到这一切:

timeout=

对于错误检查,您可以致电completed_process = subprocess.run( ['your_command', 'parameter'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) # this starts the process, waits for it to finish, and gives you... completed_process.returncode completed_process.stdout completed_process.stderr 或将completed_process.check_returncode()作为check=True的附加参数传递。

答案 1 :(得分:0)

另一种可能更简单的方法是:

import subprocess
try:
 output = subprocess.check_output("make", stderr=subprocess.STDOUT)
except subprocess.CalledProcessError as e:
  print('return code =', e.returncode)
  print(e.output)