2011-09-02 35 views
24
>>> from django.core.management import call_command 
>>> call_command('syncdb') 

从python脚本中执行syncdb管理命令。但是,我想运行相当于如何使用call_command执行Django的`syncdb --noinput`?

$ python manage.py syncdb --noinput 

从一个python shell或脚本中。我怎样才能做到这一点?

如果不想打断我是否想创建一个超级用户,以下几行不起作用。

>>> call_command('syncdb', noinput = True) # asks for input 
>>> call_command('syncdb', 'noinput') # raises an exception 

我使用Django 1.3。

+2

已解决:'call_command('syncdb',interactive = False)' – pvoosten

+0

[此问题]的副本(http://stackoverflow.com/questions/2772990/programmatically-sync-the-db-in-django)? –

+2

@lbp你不应该在评论中插入解决方案,而是在答案中,然后接受它。否则这个问题将永远没有被接受的答案。 –

回答

42
call_command('syncdb', interactive = False) 

编辑:

我发现在源代码中的答案。所有管理命令的源代码可以被称为management/commands/(command_name).py

其中syncdb命令所在的Python模块一个Python模块中被发现的是django.core.management.commands.syncdb

要发现你可以做这样的事情的命令的源代码:

(env)$ ./manage.py shell 
>>> from django.core.management.commands import syncdb 
>>> syncdb.__file__ 
'/home/user/env/local/lib/python2.7/site-packages/django/core/management/commands/syncdb.pyc' 
>>> 

当然,检查syncdb.py的内容,而不是syncdb.pyc。

,或者观察online source,该syncdb.py脚本包含:

make_option('--noinput', action='store_false', dest='interactive', default=True, 
     help='Tells Django to NOT prompt the user for input of any kind.'), 

它告诉我们,而不是--noinput在命令行中,我们应该用interactive如果我们想以自动化call_command功能命令。

+0

有谁知道你为什么使用'interactive'而不是'noinput'?这是否在Django文档中? –

+0

据我所知,关于这个问题的文件是相当模糊的。这里有一个例子:https://docs.djangoproject.com/en/dev/ref/django-admin/#running-management-commands-from-your-code – pvoosten

+0

非常感谢你的回答 – ihatecache