Code

Opened 22 months ago

Closed 22 months ago

Last modified 22 months 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.

Attachments (0)

Change History (2)

comment:1 Changed 22 months 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 22 months 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.

Add Comment

Modify Ticket

Change Properties
<Author field>
Action
as closed
as The resolution will be set. Next status will be 'closed'
The resolution will be deleted. Next status will be 'new'
Author


E-mail address and user name can be saved in the Preferences.

 
Note: See TracTickets for help on using tickets.