2011-09-02 68 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