Python >> Python tutoriál >  >> Python

Přesměrujte management.call_command() stdout do souboru

Váš příkaz pravděpodobně používá pouze print přímo. Abyste mohli zachytit nebo přesměrovat výtisky v příkazu pro správu, budete chtít použít self.stdout popisovač instance příkazu:

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')

Pokud nemůžete změnit volání tisku v rámci příkazu (což je kód v 'basequery' ve vašem příkladu), pak můžete použít kontextového manažera k dočasnému přesměrování stdout za účelem zachycení tohoto výstupu. Je důležité po přesměrování obnovit starý stdout. Viz contextlib.redirect_stdout .


Pokud máte kontrolu nad kódem příkazu pro správu, měli byste se řídit odpovědí @wim. Tato odpověď předpokládá, že nemůžete/nezměníte samotný příkaz.

Metoda @Igor je nejlepší způsob, pokud je k dispozici, ale některé příkazy ignorují stdout argument.

@Phob1a má řešení, které je v zásadě v pořádku, ale má problém uzavřít stdout (takže budoucí výstup do něj nefunguje). S některými změnami:

from django.core.management import call_command
import sys

stdout_backup, sys.stdout = sys.stdout, open('output_file', 'w+')
call_command('your_command')
sys.stdout = stdout_backup

Všimněte si, že pokud chcete pouze zahodit výstup, měli byste nahradit první příkaz:

from os import devnull
stdout_backup, sys.stdout = sys.stdout, open(devnull, 'a')
...