comandi personalizzati django-admin - AttributeError: oggetto 'comando' non ha alcun attributo 'stdout'

StackOverflow https://stackoverflow.com/questions/3167795

  •  02-10-2019
  •  | 
  •  

Domanda

Seguendo l'esempio di scrivere un comando personalizzato django-admin qui , ho creato il seguente comando personalizzato:

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

class Command(BaseCommand):
    args = ''
    help = 'Test command'

    def handle(self, *args, **options):
        self.stdout.write("Hello World!")

Sorprendentemente, ricevo il seguente analisi dello stack:

Traceback (most recent call last):
  File "D:\My Documents\Dev\MyProject\svn\trunk\dj_project\manage.py", line 11, in <module>
    execute_manager(settings)
  File "C:\Python26\lib\site-packages\django\core\management\__init__.py", line 438, in execute_manager
    utility.execute()
  File "C:\Python26\lib\site-packages\django\core\management\__init__.py", line 379, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "C:\Python26\lib\site-packages\django\core\management\base.py", line 191, in run_from_argv
    self.execute(*args, **options.__dict__)
  File "C:\Python26\lib\site-packages\django\core\management\base.py", line 218, in execute
    output = self.handle(*args, **options)
  File "D:\My Documents\Dev\MyProject\svn\trunk\dj_project\..\dj_project\dj_app\management\commands\mytest.py", line 8, in handle
    self.stdout.write("Hello World!")
AttributeError: 'Command' object has no attribute 'stdout'

Come mai? Questo è un comando molto di base personalizzato che, per quanto ho capito è conforme all'esemplare.

sto usando django 1.2.1

È stato utile?

Soluzione

Sembra che la mappatura per self.stdout è un nuovo cambio di versione tronco di Django, impegnata a maggio. Se si sta eseguendo la versione 1.2 o precedenti, questo non funzionerà - e si dovrebbe utilizzare la documentazione precedente .

Altri suggerimenti

Dal momento che questo è il primo colpo su Google scriverò un'altra soluzione a un altro problema con lo stesso messaggio di errore: Se i vostri attrezzi classe di comando __init__, deve chiamare __init__ della superclasse.

Questo lavoro sarà:

from django.core.management.base import BaseCommand

class Command(BaseCommand):

    def __init__(self, *args, **kwargs):
        super(Command, self).__init__(*args, **kwargs)
        ... do stuff

Questo non funziona:

from django.core.management.base import BaseCommand

class Command(BaseCommand):

    def __init__(self, *args, **kwargs):
       ... do stuff

Ci sono due semplici soluzioni qui. Il semplice è quello di convertire semplicemente tutte le linee self.stdout alle dichiarazioni print invece.

Questa è una soluzione su OK e si può fare.

La soluzione migliore, dal momento che self.stdout è impostato nel metodo execute(), è quello di eseguire il metodo ... execute().

Così, invece di:

Command().handle()

Do:

Command().execute()

Che sarà istituito la variabile self.stdout correttamente e sarete fuori e in esecuzione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top