2014-05-13 14 views
7

So che è nuovo, ma mi piace molto l'aspetto di click e mi piacerebbe usarlo, ma non riesco a risolverlo come passare variabili dal metodo principale ad altri metodi. Sto usando in modo errato o questa funzionalità non è ancora disponibile? Sembra piuttosto fondamentale, quindi sono sicuro che sarà lì, ma questo è stato solo un little while quindi forse no.Come passare le variabili ad altri metodi utilizzando il clic di Python (Command Line Interface Kit) pacchetto

import click 

@click.option('--username', default='', help='Username') 
@click.option('--password', default='', help='Password') 
@click.group() 
def main(**kwargs): 
    print("This method has these arguments: " + str(kwargs)) 


@main.command('do_thingy') 
def do_thing(**kwargs): 
    print("This method has these arguments: " + str(kwargs)) 


@main.command('do_y') 
def y(**kwargs): 
    print("This method has these arguments: " + str(kwargs)) 


@main.command('do_x') 
def x(**kwargs): 
    print("This method has these arguments: " + str(kwargs)) 


main() 

Quindi la mia domanda è: come faccio ad avere le opzioni di username e password siano disponibili per gli altri metodi

+0

Non posso aiutarti. Voglio solo proporti di considerare la possibilità di esaminare il parser della riga di comando 'docopt'. –

risposta

12

Grazie a @ nathj07 per avermi nella giusta direzione. Ecco la risposta:

import click 


class User(object): 
    def __init__(self, username=None, password=None): 
     self.username = username 
     self.password = password 


@click.group() 
@click.option('--username', default='Naomi McName', help='Username') 
@click.option('--password', default='[email protected]', help='Password') 
@click.pass_context 
def main(ctx, username, password): 
    ctx.obj = User(username, password) 
    print("This method has these arguments: " + str(username) + ", " + str(password)) 


@main.command() 
@click.pass_obj 
def do_thingy(ctx): 
    print("This method has these arguments: " + str(ctx.username) + ", " + str(ctx.password)) 


@main.command() 
@click.pass_obj 
def do_y(ctx): 
    print("This method has these arguments: " + str(ctx.username) + ", " + str(ctx.password)) 


@main.command() 
@click.pass_obj 
def do_x(ctx): 
    print("This method has these arguments: " + str(ctx.username) + ", " + str(ctx.password)) 


main() 
0

C'è qualche motivo non è possibile utilizzare argparse? Dovrei pensare che ti permetterebbe di ottenere ciò che stai cercando, anche se in modo leggermente diverso.

Come per l'utilizzo click allora perhaps the pass_obj will help fuori

+0

arg_parse non esegue comandi nidificati – Julius

+0

@Julius ma hai subparses che è un altro approccio alla funzionalità simile –