enregistrement automatique « commandes » pour un programme de ligne de commande en python

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

  •  09-10-2019
  •  | 
  •  

Question

Je voudrais développer un programme de ligne de commande qui peut traiter et donner « l'aide » pour les sous-commandes. Pour être concret, que j'ai un seul script appelé « cgent » et je voudrais avoir des sous-commandes « abc », « DEF » et « xyz » exécuter et accepter le reste des sys.args pour le traitement par optparse.

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

Tout cela est simple si je coder en dur les noms de sous-commande. Cependant, je voudrais être en mesure de continuer à ajouter des sous-commandes en ajoutant une classe ou d'un module (?). Ceci est similaire à l'idée qui est utilisée par les frameworks web pour ajouter des contrôleurs, par exemple. J'ai essayé de creuser à travers pour voir si Pylônes je peux recréer ce qui est fait là-bas, mais je ne l'ai pas élucidé la logique. Toutes les suggestions sur la façon de le faire?

Merci, Sean

Était-ce utile?

La solution

Vous devrez créer un « registre de commande ». Cela peut être aussi simple comme un dictionnaire.

Dans le programme principal que vous faites:

commands = {}

Et dans tous les sous-modules que vous vous ajoutez faire

from yourmodule.main import commands

def mynewcommand(arguments=here):
    pass

commands['newcommand'] = mynewcommand

Vous pouvez ensuite utiliser argparse pour gérer les commandes. Dans ce cas, vos besoins de module pour ajouter la partie subparser pour la commande aussi.

Autres conseils

Si vous n'avez pas à faire l'analyse complexe des arguments que je recommande le module boulanger . Il vous permet de définir et de leurs arguments subcommands par les décorateurs. Par exemple:

#!/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()

définit les deux sous-commandes foo et baz, avec des paramètres (optionnel) a et b. Ainsi, vous pouvez les utiliser comme ceci:

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

Il utilise également les docstrings pour générer l'aide.

Depuis le module baker est global, vos sous-commandes peuvent concerner plusieurs fichiers .py. Tant qu'ils sont importés, les sous-commandes seront automatiquement enregistrées.

En outre, il est juste un seul fichier .py de sorte que vous pouvez simplement le déposer dans votre arbre source.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top