2015-08-10 6 views
5

Ich möchte einen Django-Verwaltungsbefehl von einem meiner Tests aufrufen. Ich verwende dafür django.core.management.call_command. Und es funktioniert nicht.Djangos call_command schlägt mit fehlenden erforderlichen Argumenten fehl

Ich habe einen Befehl mit 4 erforderlichen Argumenten. Als ich es nenne, werfen sie alle Argumente fehlen, obwohl ich sie bin vorbei:

call_command('my_command', url='12', project='abc', website='zbb', title='12345') 

Ich erhalte den Basisbefehlsfehler, die --url, --project, --website und --title fehlt .

Ich habe kein anderes Ziel für diese Argumente angegeben.

I an der call_command Quelle gesucht und lokalisiert das Problem auf die folgende Zeile in call_command:

if command.use_argparse: 
    # Use the `dest` option name from the parser option 
    opt_mapping = {sorted(s_opt.option_strings)[0].lstrip('-').replace('-', '_'): s_opt.dest 
        for s_opt in parser._actions if s_opt.option_strings} 
    arg_options = {opt_mapping.get(key, key): value for key, value in options.items()} 
    defaults = parser.parse_args(args=args) ****** THIS ***** 
    defaults = dict(defaults._get_kwargs(), **arg_options) 
    # Move positional args out of options to mimic legacy optparse 
    args = defaults.pop('args',()) 

args die Positions Argumente call_commands übergeben wird, die leer ist. Ich übergebe nur benannte Argumente. parser.parse_args beschwert sich die erforderlichen Variablen fehlen.

Dies ist in Django 1.8.3.

Hier add_arguments Funktion (I entfernt nur die Hilfe Saiten der Kürze halber) mein Befehl lautet:

def add_arguments(self, parser): 
    parser.add_argument('--url', action='store', required=True) 
    parser.add_argument('--project', action='store', required=True) 
    parser.add_argument('--continue-processing', action='store_true', default=False) 
    parser.add_argument('--website', action='store', required=True) 
    parser.add_argument('--title', action='store', required=True) 
    parser.add_argument('--duplicate', action='store_true',default=False) 
+1

zeigen Sie den Code Ihres Befehls (mindestens die Definitionen 'option_list') – Anentropic

+0

Hinzugefügt die Funktion add_arguments function. – zmbq

+0

nennen Sie es wirklich mit 'arg1 = '12 ', arg2 =' abc ', arg3 =' zbb ', arg4 =' 12345'' Schlüsselwörtern args? Ist Ihnen bekannt, dass für die Option 'parser.add_argument ('- url')' das Schlüsselwort arg 'url' sein sollte? – Anentropic

Antwort

3

Basierend auf diesem Stück Code, das Sie auf dem Laufenden, folgerte ich habe in call_command argument is required

, dass die benötigte benannte Argumente müssen über *args übergeben werden, nicht nur die Positionale.

**kwargs umgeht den Parser. Es sieht also nichts, was Sie dort definiert haben. **kwargs kann die *args Werte überschreiben, aber *args benötigt immer noch etwas für jedes erforderliche Argument. Wenn Sie das nicht möchten, deaktivieren Sie das Attribut required.

+1

Ja, das habe ich auch im call_command-Code gesehen. Es ist ein Fehler in call_command. Ich kann die erforderlichen Argumente nicht in * Argumenten übergeben - was ist ihre richtige Reihenfolge?Vielleicht die Reihenfolge, die ich aufgerufen habe, add_argument, vielleicht etwas anderes, vielleicht hängt es von der Betriebssystem- oder Python-Version ab. Ich möchte es nicht riskieren. – zmbq

+0

'argparse' versucht unempfindlich zu sein. – hpaulj

+0

Wie kann es * möglicherweise * unsensibel sein? Wenn ich '1', '2', '3', '4' in Argumente setze, wie kann man dann feststellen, welches eine URL ist, welches Projekt, etc ...? – zmbq