我在文件'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+
我需要在测试中获取脚本输出。我该怎么做?
答案 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本身的附加参数。