2

我想通过 python 子进程运行 django unittest,我想将所有数据(尤其是单词 Failure 或 OK)存储在一个变量中。但是,当我使用 subprocess 运行它时,输出仅包含以下部分:

“正在为别名 'default' 创建测试数据库......” “正在为别名 'default' 销毁测试数据库......”

其余的只是出现在屏幕上,这是我不想要的。如何将 django unittest 的所有输出转换为变量。

args_list = ['python', '/path/to/manage.py', 'test', 'myapp']
process=subprocess.Popen(args_list, stdout=subprocess.PIPE)
output, errors = process.communicate()
print output

输出将等于:为别名“默认”创建测试数据库...销毁别名“默认”的测试数据库...

但是在我的屏幕上出现了 django unittest 的整个标准输出。如何将所有输出存储到变量中。

4

4 回答 4

2

您需要将标准错误重定向到标准输出。这是固定代码:

args_list = ['python', '/path/to/manage.py', 'test', 'myapp']
process=subprocess.Popen(args_list, stderr=subprocess.STDOUT, stdout=subprocess.PIPE)
output, errors = process.communicate()
print output

或者,在 shell 中,您可以键入如下内容:

python manage.py test myapp > stdout.txt 2> stderr.txt
于 2014-12-24T21:42:45.800 回答
1

如果您真的想将 stdout 重定向到一个变量进行检查,那么您可以使用以下代码进行操作:

from cStringIO import StringIO
import sys

output = StringIO()
sys.stdout = output
print "Hello World!"
print 42
sys.stdout = sys.__stdout__
print output.getvalue()
>>>
Hello World!
42
于 2012-11-09T02:54:06.487 回答
1

您可以使用 unittest.TestResult 对象处理测试结果。有关示例,请参见https://stackoverflow.com/a/284192/579461 。

于 2012-11-09T02:38:53.513 回答
0

如何将所有输出存储到变量中。

将标准错误重定向到标准输出:

from subprocess import check_output, STDOUT

output = check_output(args_list, stderr=STDOUT)
print output,
于 2014-12-26T00:32:13.600 回答