5

che sto cercando di fare il mio programma Python interattiva in linea di comando, l'utente dovrebbe essere in grado di fare cose come:fare il mio programma a riga di comando python interattiva con argparse

python myprogram.py --create 

poi

python myprogram.py --send 

Il problema in questo quando il programma si ferma e si riavvia ogni volta, quindi perdo la mia variabile e l'oggetto che ho creato con il primo comando.

sto usando argparse in questo modo:

parser = argparse.ArgumentParser() 
parser.add_argument('-c','--create' ,help='',action='store_true') 
parser.add_argument('-s','--send',help='',action='store_true') 
args = parser.parse_args() 

if args.create: 
    create() 
elif args.send : 
    send() 

Non voglio smettere di programma tra il comando, come fare questo?

esempio: https://coderwall.com/p/w78iva

+2

Penso che quello che vuoi sia un ciclo che stampa un menu di azioni possibili, una delle quali viene "abbandonata". –

+0

Argparse ha una funzione per farlo. Quello di cui ho bisogno è interagire con il mio programma senza smettere di funzionare. – TheShun

risposta

0

Il diffrence in cmd e argparse è che cmd è un "line-oriented command interpreter" mentre argparse è un parser for sys.argv.

L'esempio analizza sys.argv passato durante l'esecuzione del programma, quindi se ottiene il valore si avvia una funzione e quindi si chiude.

argparse analizzerà solo il sys.argv durante l'esecuzione del programma.

Si potrebbe aggiungere del codice per poter lavorare con lo args si passa come una funzione o classe o fare nel menu di programma che si potrebbe operare con raw_input. Esempio:

class Main(): 
    def __init__(self, create=None, send=None): 
    if create: 
    self.create(create) 
    elif send: 
    self.send(send) 

    option = raw_input('What do you want to do now?') 
    print option 

    def create(self, val): 
    print val 

    def send(self, val): 
    print val 


if __name__ == "__main__": 
    parser = argparse.ArgumentParser() 
    parser.add_argument('-c','--create' ,help='',action='store_true') 
    parser.add_argument('-s','--send',help='',action='store_true') 
    args = parser.parse_args() 

    Main(args.create, args.send) 

Altri poi che Python argparse and controlling/overriding the exit status code o python argparse - add action to subparser with no arguments? potrebbe aiutare.

Nella prima mostra come è possibile ignorare la chiusura e nella seconda come è possibile aggiungere sottocomandi o quitazioni.

+0

Tes Quello di cui ho bisogno è poter dare il comando senza uscire dal programma. Come quando fai clic su un pulsante per eseguire un'azione, quindi fai clic su un altro per eseguire un'altra azione, ma senza chiudere il programma – TheShun

5

Ecco un semplice script interattivo. Io uso argparse per analizzare le linee di input, ma per il resto non è essenziale per l'azione. Tuttavia può essere un modo pratico per aggiungere opzioni al comando 'create'. Ad esempio, utilizza ipythonargparse per gestire i suoi comandi %magic:

import argparse 
parser = argparse.ArgumentParser(prog='PROG', description='description') 
parser.add_argument('cmd', choices=['create','delete','help','quit']) 

while True: 
    astr = raw_input('$: ') 
    # print astr 
    try: 
     args = parser.parse_args(astr.split()) 
    except SystemExit: 
     # trap argparse error message 
     print 'error' 
     continue 
    if args.cmd in ['create', 'delete']: 
     print 'doing', args.cmd 
    elif args.cmd == 'help': 
     parser.print_help() 
    else: 
     print 'done' 
     break 

Questo potrebbe essere messo a nudo giù al while loop, la linea raw_input, e la vostra propria valutazione della variabile astr.

Le chiavi utilizzando argparse qui sono:

  • parse_args può prendere una lista di stringhe (il risultato di split()) invece di usare quella predefinita sys.argv[1:].
  • se parse_args vede un problema (o '-h') stampa un messaggio e prova a 'uscire'. Se si desidera continuare, è necessario intercettare l'errore, quindi il blocco try.
  • l'output di parse_args è un oggetto spazio dei nomi semplice. Si accede agli argomenti come attributi.
  • potresti facilmente sostituire il tuo parser.
Problemi correlati