在Python测试中从Python脚本获取输出

时间:2012-02-01 12:23:15

标签: python subprocess argparse

我在文件'bin / test'中有一个简单的python脚本:

#!/usr/bin/env python

import argparse

PROGRAM_NAME        = "name"
PROGRAM_VERSION     = "0.0.1"
PROGRAM_DESCRIPTION = "desc"
parser = argparse.ArgumentParser(prog=PROGRAM_NAME, description=PROGRAM_DESCRIPTION)
parser.add_argument('--version', action='version', version='%(prog)s ' + PROGRAM_VERSION)

args = parser.parse_args()

当我使用--version参数或--help运行它时,它会打印所有内容:

$ bin/test --version
name 0.0.1

$ bin/test --help
usage: name [-h] [--version]

desc

optional arguments:
  -h, --help  show this help message and exit
  --version   show program's version number and exit

当我使用subprocess.check_output运行文件时,它没有任何结果:

>>> subprocess.check_output(["bin/test", "--help"],  stderr=subprocess.STDOUT, shell=True)
''
>>> subprocess.check_output(["bin/test", "--version"],  stderr=subprocess.STDOUT, shell=True)
''

我正在使用带有Python版本的Ubuntu 11.10:

python --version
Python 2.7.1+

我需要在测试中获取脚本输出。我该怎么做?

1 个答案:

答案 0 :(得分:5)

如果您使用shell=True,请不要将程序及其参数作为列表传递。这有效:

subprocess.check_output("bin/test --help",  stderr=subprocess.STDOUT, shell=True)

编辑:当然,将shell留给False也会有效。

Edit2:文档解释了原因

  

在Unix上, shell = True :如果 args 是一个字符串,它指定   命令字符串通过shell执行。这意味着   string的格式必须与在键入时的格式完全相同   shell提示。这包括,例如,引用或反斜杠   转义带有空格的文件名。如果 args 是一个序列,那么   第一项指定命令字符串,任何其他项目将   被视为shell本身的附加参数。