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:
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.
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
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.
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:
Bien que [1]
est déjà répondu ailleurs, je vais inclure une brève explication ici:
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:
~/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
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)
Créez votre fichier de paramètres au format:
-l:4
-h:7
-w:6
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.
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
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
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.