2015-08-10 16 views
5

Voglio chiamare un comando di gestione Django da uno dei miei test. Sto usando django.core.management.call_command per questo. E non funziona.Il call_command di Django fallisce con gli argomenti richiesti mancanti

Ho un comando con 4 argomenti richiesti. Quando lo chiamo io, si lamenta tutti gli argomenti mancano anche se io li sto passando:

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

ottengo l'errore di comando base che --url, --project, --website e --title mancano .

Non ho specificato una destinazione diversa per questi argomenti.

Ho guardato il sorgente call_command e individuato il problema alla seguente riga 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 è argomenti posizionali passati a call_commands, che è vuoto. Sto solo passando argomenti con nome. parser.parse_args lamenta che mancano le variabili richieste.

Questo è in Django 1.8.3.

Ecco funzione add_arguments del mio comando (ho appena tolto le corde di aiuto per brevità):

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

mostra il codice del comando (almeno le definizioni di 'option_list') – Anentropic

+0

Aggiunta la sorgente della funzione add_arguments. – zmbq

+0

lo stai davvero chiamando con 'arg1 = '12 ', arg2 =' abc ', arg3 =' zbb ', arg4 =' 12345'' parole chiave args? sei consapevole che per l'opzione 'parser.add_argument ('- url')' la parola chiave arg dovrebbe essere 'url'? – Anentropic

risposta

3

Sulla base di quel pezzo di codice che hai postato, ho concluso in call_command argument is required

che la gli argomenti nominati obbligatori devono essere passati attraverso *args, non solo i posizionali.

**kwargs ignora il parser. Quindi non vede nulla che tu abbia definito lì. **kwargs può ignorare i valori *args, ma *args ha ancora bisogno di qualcosa per ogni argomento richiesto. Se non si desidera farlo, disattivare l'attributo required.

+1

Sì, l'ho visto anche nel codice di call_command. È un bug in call_command. Non posso passare gli argomenti richiesti in * args: qual è il loro giusto ordine?Forse l'ordine che ho chiamato add_argument, forse qualcos'altro, forse dipende dal sistema operativo o dalla versione di Python. Non voglio rischiare. – zmbq

+0

'argparse' cerca di non essere sensibile all'ordine. – hpaulj

+0

Come può * eventualmente * essere insensibile? Se metto '1', '2', '3', '4' in args, come può dire quale è l'url, quale è il progetto, ecc ...? – zmbq

Problemi correlati