python-将management.call_command()标准输出重定向到文件

我一直在尝试使用以下代码重定向自定义django命令的标准输出:

from django.core.management.base import BaseCommand
from django.core import management


class Command(BaseCommand):

    def handle(self, *args, **options):
        f = open('/tmp/output', 'r+')
        management.call_command('basequery', 'list', 'log', stdout=f)
        f.close()

但是,当我从manage.py调用此命令时,标准输出出现在控制台上,并且/ tmp / output文件已创建但为空.

这是我正在尝试的django documentation

最佳答案
您的命令可能只是直接使用print.为了能够在管理命令中捕获或重定向打印,您需要使用命令实例的self.stdout句柄:

from __future__ import print_function

class Command(BaseCommand):

    def handle(self, *args, **options):
        # incorrect way to print in a management command:
        print('This line will go to the terminal')

        # correct ways to print in a management command:
        print('This line will go into the StringIO', file=self.stdout)
        self.stdout.write('This will also go into the StringIO')

如果您绝对不能更改命令的错误打印语句(在您的示例中是’basequery’命令中的代码错误),则可以使用上下文管理器临时重定向stdout以便捕获该输出.重定向后还原旧的stdout很重要.参见contextlib.redirect_stdout.

转载注明原文:python-将management.call_command()标准输出重定向到文件 - 代码日志