web-dev-qa-db-fra.com

Comment créer une commande avec des arguments et un fichier de configuration?

Directement au point, je veux donner à l'utilisateur la flexibilité de passer des arguments à une commande afin de contrôler la façon dont les commandes doivent s'exécuter, quelque chose comme:

pcap -d 30 -w 2

En d'autres termes:

Je veux faire une commande qui ressemble exactement aux commandes Linux. Une commande qui fonctionne exactement comme les commandes Linux. Une commande qui a des options (par exemple: des arguments) dans le même style que les commandes Linux.

Je veux créer une commande qui fonctionne en prenant des arguments de l'utilisateur ou en utilisant ses arguments par défaut (lus dans un fichier de configuration) au cas où aucun argument ne serait fourni par l'utilisateur, exactement comme n'importe quelle autre commande Linux.

Une commande avec --help qui montre les différentes options.

Je sais comment faire une commande sous Linux. Mais je ne sais pas comment faire ces options (arguments de commande). Je ne sais pas comment ces arguments sont programmés.

un guide, un tutoriel ou un exemple fera l'affaire

Remarque:

  1. Toutes mes excuses si cette question est posée dans la mauvaise pile.
  2. Je m'excuse également pour la version précédente de la question, elle était mal formulée.
1
McLan

Puisque vous mentionnez python, une réponse python:

si vous voulez simplement définir une valeur par défaut pour un argument, vous pouvez simplement définir la valeur par défaut de la fonction:

def show(val = 30):
    print(val)
# to print the default value (30)
show()
# to show another value (e.g. 40)
show(40)

En d'autres termes, cela affichera la valeur par défaut si vous ne donnez aucun argument, tandis qu'il utilise l'argument if vous lui donnez.

Plus avancé; lire les valeurs par défaut d'un fichier, avec la possibilité de remplacer par donnant les arguments

La même chose peut être faite, mais en lisant les arguments par défaut d'un fichier. Cela donnera la possibilité de définir des arguments dans un fichier de paramètres au lieu de les modifier dans le code lui-même.

Disons que j'ai un fichier de paramètres, testconf.txt:

length:4
height:7
width:6

... et je veux lire ces valeurs dans mon application en tant qu'arguments par défaut, mais l'utilisateur peut les remplacer par des arguments personnalisés:

#!/usr/bin/env python3
import sys

# path to my config file
conf_file = "/home/jacob/Bureaublad/testconf.txt"
# read the default arguments from a file
def_args = [l.strip() for l in open(conf_file).readlines()]
# replace default args by possible custom args
cust_args = sys.argv[1:]
for cu in cust_args:
    argname = cu.split(":")[0]
    try:
        match = [arg for arg in def_args if arg.startswith(argname)][0]
    except IndexError:
        print("incorrect argument: ", cu)
    else:
        def_args[def_args.index(match)] = cu

def get_arg(s):
    return [val.split(":")[1] for val in def_args if val.startswith(s)][0]

l = get_arg("length")
w = get_arg("width")
h = get_arg("height")

print("l=", l, "w=", w, "h=", h)

Maintenant, je peux exécuter le script sans arguments:

$ '/home/jacob/Bureaublad/pscript_4.py'
l= 4 w= 6 h= 7

Ou arguments de largeur:

$ '/home/jacob/Bureaublad/pscript_4.py' length:10 height:456
l= 10 w= 6 h= 456

L'ordre des arguments donnés n'est pas pertinent dans cette configuration. En cas d'argument incorrect:

$ '/home/jacob/Bureaublad/pscript_4.py' monkey
incorrect argument:  monkey
l= 4 w= 6 h= 7

Remarque

Dans un "vrai" logiciel, vous pouvez (et devriez) le rendre plus avancé bien sûr en ajoutant un avertissement si le fichier de paramètres est incorrect ou manquant, décidez quoi faire ensuite, mais c'est l'idée de base.


ÉDITER

D'après vos commentaires, je comprends que de deux manières, la réponse ci-dessus n'est pas (encore) ce que vous recherchez:

  1. Vous souhaitez exécuter la commande sans le chemin d'accès à l'exécutable (script), et son extension, et
  2. Vous aimeriez avoir un format plus "conventionnel" des options.

Bien que [1] est déjà répondu ailleurs, je vais inclure une brève explication ici:

1. Exécutez la commande sans chemin ni extension

Vous pouvez exécuter des exécutables et des scripts sans avoir à inclure le chemin d'accès au script en le rendant exécutable (chmod +x <files>), et placez-les n'importe où dans $ PATH .

Sous Linux, l'extension (.py) ne joue aucun rôle, vous pouvez donc utiliser le script sans extension de toute façon.

Pour être concret:

  • créer, s'il n'existe pas encore, le répertoire ~/bin
  • créer et enregistrer le script, exactement comme mentionné dans la réponse d'origine, comme showsize (sans extension) dans ~/bin, et rendre le script exécutable.

    Après une déconnexion/connexion, vous pouvez simplement exécuter le script par la commande:

    showsize
    

2. Modifiez le format des options

Comme mentionné, vous pouvez facilement changer le format des options, par exemple: Pour analyser les options, étant donné que:

-l 23 -h 210 -w 321
  • Si vous incluez dans le script:

    args = sys.argv [1:]

    Le résultat pour args sera une liste:

    ["-l", "23", "-h", "210", "-w", "321"]
    

    Maintenant, ce que nous devons faire pour obtenir la valeur de -h, consiste simplement à rechercher l'index de -h, et choisissez le premier élément suivant dans la liste:

    height = args[args.index("-h")+1]
    print(height)
    
    > 210
    

    dans un script:

    #!/usr/bin/env python3
    import sys
    
    # path to my config file
    conf_file = "/home/jacob/Bureaublad/testconf.txt"
    # read the default arguments from a file
    def_args = [l.strip().split(":") for l in open(conf_file).readlines()]
    # replace default args by possible custom args
    cust_args = sys.argv[1:]
    for carg in cust_args:
        if carg in ["-l", "-h", "-w"]:                        
            for d in def_args:
                d[1] = cust_args[cust_args.index(carg)+1] if d[0] == carg else d[1]
    
    def get_arg(s):
        # fetch values from the list
        return [val[1] for val in def_args if val[0] == s][0]
    
    l = get_arg("-l")
    w = get_arg("-w")
    h = get_arg("-h")
    
    print("length =", l, "\nwidth =", w, "\nheight =", h)
    

Comment utiliser

  1. Créez votre fichier de paramètres au format:

    -l:4
    -h:7
    -w:6
    
  2. Copiez le script dans un fichier vide, enregistrez-le sous la forme showsize (sans extension) dans ~/bin ou n'importe où ailleurs dans $PATH, et rendez-le exécutable.

  3. Dans la section d'en-tête du script, définissez le chemin d'accès au fichier de paramètres:

    # path to my config file
    conf_file = "/home/jacob/Bureaublad/testconf.txt"
    

    Exécutez maintenant la commande:

    $ showsize
    length = 4 
    width = 6 
    height = 7
    

    Ou:

    $ showsize -l 300 -h 345 -w 751
    length = 300 
    width = 751 
    height = 345
    
3
Jacob Vlijm

Fichier de script:

#!/bin/bash

# set default values
X=10
Y="lorem ipsum"

source ~/.myscript.conf

echo "X = $X, Y = $Y"

Fichier .myscript.conf:

X=20
Y="something else"

Maintenant, si un utilisateur exécute un fichier de script et n'a pas de fichier .myscript.conf dans son répertoire personnel, le script utilisera X = 10 et Y = "lorem ipsum", s'il y a un fichier de configuration, il utilisera les valeurs du fichier.

La commande source exécute le contenu du fichier donné comme argument dans le shell actuel, donc ici, elle affectera de nouvelles valeurs aux valeurs par défaut de remplacement X et Y du fichier de script.

Puisque ~ pointe vers le répertoire de base de l'utilisateur, cette configuration fonctionnera pour tout utilisateur de votre système (également root).

[Modifier] Et dans votre exemple spécifique:

#!/bin/bash
X=10
Y=2
source ~/.config.conf
pcap -d $X -w $Y
2
Marek Bettman

Bash: identique à Marek avec l'approvisionnement d'un fichier avec les valeurs de l'utilisateur, avec la mise en garde que ce fichier peut faire n'importe quoi, et les fautes de frappe provoqueront juste des erreurs de syntaxe, donc cela nécessite un peu de savoir-faire de l'utilisateur. Vous pouvez analyser les paramètres de ligne de commande avec getopts.

Python: voir le module argparse pour analyser les paramètres de ligne de commande, et ConfigParser (v2) et configparser (v3) pour analyser un fichier .ini.

En règle générale, vous utilisez un fichier de configuration pour les choses qui ne changent pas souvent et des paramètres de ligne de commande pour les choses qui sont probablement différentes à chaque exécution. La modification d'un fichier de configuration à chaque exécution est un PITA.

1
xenoid