我想通过python子进程运行django unittest,我想将所有数据(尤其是单词Failure或OK)存储在变量中。但是当我使用subprocess来运行它时,输出只包含部分:
“为别名创建测试数据库'默认'...” “销毁别名'默认'的测试数据库......”
剩下的就出现在屏幕上,这是我不想要的。如何将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
输出将等于: 为别名'default'创建测试数据库... 销毁别名'default'的测试数据库......
然而,在我的屏幕上,显示了django unittest的整个标准输出。如何将所有输出存储到变量中。
答案 0 :(得分:2)
您需要将stderr重定向到stdout。这是固定代码:
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
答案 1 :(得分:1)
您可以使用unittest.TestResult对象处理测试结果。有关示例,请参阅https://stackoverflow.com/a/284192/579461。
答案 2 :(得分: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
答案 3 :(得分:0)
如何将所有输出存储到变量中。
将stderr重定向到stdout:
from subprocess import check_output, STDOUT
output = check_output(args_list, stderr=STDOUT)
print output,