自定义django-admin命令 - AttributeError:'Command'对象没有属性'stdout'

时间:2010-07-02 17:20:02

标签: django django-manage.py

按照编写自定义django-admin命令here的示例,我创建了以下自定义命令:

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!")

令人惊讶的是,我收到了以下堆栈跟踪:

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'

为什么?这是一个非常基本的自定义命令,据我所知,它符合示例。

我正在使用django 1.2.1

3 个答案:

答案 0 :(得分:11)

由于这是Google上的第一个热门话题,我将使用相同的错误消息为另一个问题编写另一个解决方案: 如果你的类Command实现__init__,它必须调用超类的__init__。

这将有效:

from django.core.management.base import BaseCommand

class Command(BaseCommand):

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

这不起作用:

from django.core.management.base import BaseCommand

class Command(BaseCommand):

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

答案 1 :(得分:4)

看起来self.stdout的映射是Django的trunk版本的一个非常新的变化,在5月份提交。如果您正在运行1.2版本或更早版本,则无法运行 - 您应该使用the earlier documentation

答案 2 :(得分:4)

这里有两个简单的解决方案。简单的一种方法是简单地将所有self.stdout行转换为print语句。

这是一个很好的解决方案,你可以做到。

self.stdout方法设置execute()以来,更好的解决方案是...运行execute()方法。

所以而不是:

Command().handle()

执行:

Command().execute()

即可正确设置self.stdout变量,您即可关闭并运行。