【问题标题】:custom django-admin commands - AttributeError: 'Command' object has no attribute 'stdout'自定义 django-admin 命令 - AttributeError: 'Command' 对象没有属性 'stdout'
【发布时间】:2010-07-02 17:20:01
【问题描述】:

按照编写自定义 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

【问题讨论】:

    标签: django django-manage.py


    【解决方案1】:

    由于这是 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
    

    【讨论】:

    • 这对我有用,现在的正确答案太旧了
    【解决方案2】:

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

    这是一个不错的解决方案,您可以做到。

    由于self.stdout 是在execute() 方法中设置的,更好的解决方案是...运行execute() 方法。

    所以而不是:

    Command().handle()
    

    做:

    Command().execute()
    

    这将正确设置self.stdout 变量,您将开始运行。

    【讨论】:

    • 这个答案应该被选为最佳答案!
    • 感谢您的建议。谁能确认句柄和执行之间有什么真正的区别?我刚刚更改了要执行的句柄定义,我得到了想要的结果。但很少有人担心使用句柄代替执行有什么实际好处。
    【解决方案3】:

    看起来self.stdout 的映射是 Django 主干版本中一个非常新的变化,于 5 月提交。如果您运行的是 1.2 或更早版本,这将不起作用 - 您应该使用 the earlier documentation。

    【讨论】:

    • 我正在运行 django 1.2.1,所以仍然需要一个答案。将更新问题。
    • 我不知道为什么我的回答不令人满意。 Django 1.2.1 于 5 月 24 日发布,此更改于 6 月 6 日进行。
    • @Jonathan:只需将“self.stdout.write”替换为“print”即可。 @Daniel我认为您的回答将受益于提及实际修复。但是 +1 因为它帮助我解决了我的问题:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-09
    • 1970-01-01
    • 2019-09-10
    • 2019-10-20
    • 2020-05-10
    • 2012-08-08
    • 1970-01-01
    相关资源
    最近更新 更多