la registrazione automatica “comandi” per un programma a riga di comando in python

StackOverflow https://stackoverflow.com/questions/4642373

  •  09-10-2019
  •  | 
  •  

Domanda

Vorrei sviluppare un programma a riga di comando in grado di elaborare e dare "aiuto" per sottocomandi. Per essere concreti, dire che ho un unico script chiamato "cgent" e mi piacerebbe avere sottocomandi "abc", "def", e "xyz" esecuzione e accettare il resto dei sys.args per l'elaborazione da optparse.

cgent abc [options] 
cgent help abc
....

Tutto questo è semplice se mi codificare i nomi sottocomando. Tuttavia, mi piacerebbe essere in grado di continuare ad aggiungere subcommands con l'aggiunta di una classe o modulo (?). Questo è simile all'idea utilizzato dal framework web per l'aggiunta di regolatori, per esempio. Ho provato scavo attraverso piloni per vedere se posso ricreare ciò che viene fatto qui, ma non ho disfatto la logica. Qualche suggerimento su come fare questo?

Grazie, Sean

È stato utile?

Soluzione

Si dovrà creare un "registro comandi". Questo può essere semplice come un dizionario.

Nel programma principale che fate:

commands = {}

E in ogni sottomoduli si aggiunge fare

from yourmodule.main import commands

def mynewcommand(arguments=here):
    pass

commands['newcommand'] = mynewcommand

Quindi è possibile utilizzare argparse per gestire i comandi. Nel qual caso le vostre esigenze di modulo per aggiungere la parte subparser per il comando troppo.

Altri suggerimenti

Se non si deve fare l'analisi complessa di argomenti vi consiglio il modulo fornaio. Esso consente di definire comandi secondari e loro argomenti attraverso decoratori. Ad esempio:

#!/usr/bin/env python
import baker

@baker.command()
def foo(a=1):
    print 'foo:', a

@baker.command()
def baz(b=1):
    print 'baz:', b

baker.run()

definisce la foo due sottocomandi e baz, con (opzionale) parametri a e b. In modo da poterli utilizzare in questo modo:

$ ./test_baker.py foo --a 2
foo: 2
$ ./test_baker.py baz
baz: 1

Si utilizza anche le docstring per generare l'aiuto.

Poiché il modulo baker è globale, i tuoi sottocomandi possono abbracciano diversi file .py. Fintanto che vengono importati, i sottocomandi saranno registrati automaticamente.

Inoltre si tratta solo di un singolo file .py così si può solo cadere nel vostro albero dei sorgenti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top