#18555 closed Bug (invalid)
Calling management commands programmatically without options no longer works [regression]
Reported by: | Owned by: | nobody | |
---|---|---|---|
Component: | Core (Management commands) | Version: | dev |
Severity: | Normal | Keywords: | |
Cc: | Triage Stage: | Unreviewed | |
Has patch: | no | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
I apologize in case I'm doing this wrong from the very beginning, but for my application this looks like a relatively recent "cleanup" introduced a regression...
In Django 1.3.1, I was able to call the syncdb command from my python application like this:
django.core.management.commands.syncdb.Command().handle_noargs(interactive=False)
If I'm doing this with django on trunk, I get
File "/usr/local/lib/python2.7/dist-packages/django/core/management/commands/syncdb.py", line 28, in handle_noargs verbosity = int(options.get('verbosity')) TypeError: int() argument must be a string or a number, not 'NoneType'
This seems to be a direct result from the fixes for ticket #13760 and similar, where code like
int(options.get('verbosity', 1))
was replaced with:
int(options.get('verbosity'))
The reasoning behind these patches was that the getopt parsing already provides reasonable defaults for all options -- but this is only true for arguments provided by the command line and not when a handle or handle_noargs method is called directly.
You can of course easily work around this problem by explicitly providing the options explicitely (in my case, I have to add verbosity=0 and database='default') -- but I wonder whether there is not a bunch of code out there that will break like mine did...
I don't know what a good solution would be, specifying defaults twice (and possibly inconsistently) as previously is certainly not an option.
Change History (2)
comment:1 by , 12 years ago
Resolution: | → invalid |
---|---|
Status: | new → closed |
comment:2 by , 12 years ago
Well, that makes perfect sense and I'm glad I added the "I apologize in case I'm doing this wrong from the very beginning" in my report ;) Thank you very much for your swift reply and sorry for wasting your time.
Calling commands programmatically must be done through
call_command
.https://docs.djangoproject.com/en/dev/ref/django-admin/#running-management-commands-from-your-code