Opened 3 years ago

Closed 3 years ago

Last modified 3 years ago

#18555 closed Bug (invalid)

Calling management commands programmatically without options no longer works [regression]

Reported by: marcelcoding@… Owned by: nobody
Component: Core (Management commands) Version: master
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 Changed 3 years ago by claudep

  • Needs documentation unset
  • Needs tests unset
  • Patch needs improvement unset
  • Resolution set to invalid
  • Status changed from new to closed

Calling commands programmatically must be done through call_command.

https://docs.djangoproject.com/en/dev/ref/django-admin/#running-management-commands-from-your-code

comment:2 Changed 3 years ago by marcelcoding@…

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.

Note: See TracTickets for help on using tickets.
Back to Top