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

Szy*_*ski 0 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()
Run Code Online (Sandbox Code Playgroud)

当我用--versionparam 运行它,或者--help,它打印一切OK:

$ 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
Run Code Online (Sandbox Code Playgroud)

当我使用文件运行时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)
''
Run Code Online (Sandbox Code Playgroud)

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

python --version
Python 2.7.1+
Run Code Online (Sandbox Code Playgroud)

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

Ric*_*nes 5

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

subprocess.check_output("bin/test --help",  stderr=subprocess.STDOUT, shell=True)
Run Code Online (Sandbox Code Playgroud)

编辑:当然,留下shellFalse将有太多的工作.

Edit2:文档解释了原因

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