Comment accéder aux arguments de ligne de commande en Python?

362

J'utilise python pour créer la configuration des paramètres de mon projet, mais j'ai besoin d'aide pour obtenir les arguments de la ligne de commande.

J'ai essayé ceci sur le terminal:

$python myfile.py var1 var2 var3

Dans mon fichier Python, je veux utiliser toutes les variables qui sont entrées.

ParisNakitaKejser
la source
1
Le module baker est un excellent outil pour écrire des applications en ligne de commande Python. pypi.python.org/pypi/Baker/1.02
Spike Gronim

Réponses:

503

Le didacticiel Python l'explique :

import sys

print(sys.argv)

Plus précisément, si vous exécutez python example.py one two three:

>>> import sys
>>> print(sys.argv)
['example.py', 'one', 'two', 'three']
SilentGhost
la source
7
Réservoirs, mais maintenant je dois utiliser mon var1? ce qui se passe ici .. :)
ParisNakitaKejser
102
Dooh, got it (sys.argv [1]): D
ParisNakitaKejser
117
import sys

sys.argv[1:]

vous donnera une liste d'arguments (n'incluant pas le nom du fichier python)

Ryan M
la source
5
Que veut [1:]dire?
Kolob Canyon
8
@KolobCanyon cela signifie "prendre une sous-liste à partir de l'index 1 jusqu'à la fin", c'est-à-dire ignorer le premier élément
Kamil Jarosz
@KolobCanyon prend le deuxième argument [1:]vers le haut car le premier argument de sys.argvest par défaut le nom du fichier python que vous exécutez par exemple testrun.py.
Samuel Nde
95

Je recommande fortement argparsece qui vient avec Python 2.7 et versions ultérieures.

Le argparsemodule réduit le code de la plaque de la chaudière et rend votre code plus robuste, car le module gère tous les cas d'utilisation standard (y compris les sous-commandes), génère l'aide et l'utilisation pour vous, vérifie et désinfecte l'entrée utilisateur - toutes les choses dont vous devez vous soucier lorsque vous utilisent l' sys.argvapproche. Et c'est gratuit (intégré).

Voici un petit exemple:

import argparse

parser = argparse.ArgumentParser("simple_example")
parser.add_argument("counter", help="An integer will be increased by 1 and printed.", type=int)
args = parser.parse_args()
print(args.counter + 1)

et la sortie pour python prog.py -h

usage: simple_example [-h] counter

positional arguments:
  counter     counter will be increased by 1 and printed.

optional arguments:
  -h, --help  show this help message and exit

et python prog.py 1comme vous vous en doutez:

2
Michael Dorner
la source
7
Réponse de qualité, je ne sais pas vraiment pourquoi quelqu'un ici utiliserait l'une des autres approches données ici. D'autant plus qu'il est intégré! Vous n'avez pas mieux à faire que d'analyser?
Bassinator
Juste pour mentionner comment vous devez accéder à l'argument spécifique dans l'espace de noms args: args.counter
MikeL
1
@Bassinator Dans les cas où aucune analyse d'arguments n'est nécessaire.
réduction de l'activité
pour utiliser la valeur par défaut, sans valeur spécifique dans la ligne de commande, vous pouvez utiliser quelque chose comme: parser.add_argument('var3', nargs='?', type=int, default=3)var3 est un paramètre facultatif, si vous ne spécifiez pas de valeur dans la ligne de commande, vous pouvez accéder à var3 dans votre code, valeur par défaut pour var3 = 3
Albicocco
56

Code Python:

import sys

# main
param_1= sys.argv[1] 
param_2= sys.argv[2] 
param_3= sys.argv[3]  
print 'Params=', param_1, param_2, param_3

Invocation:

$python myfile.py var1 var2 var3

Production:

Params= var1 var2 var3 
Charles P.
la source
24

Vous pouvez utiliser sys.argvpour obtenir les arguments sous forme de liste.

Si vous devez accéder à des éléments individuels, vous pouvez utiliser

sys.argv[i]  

iest index, 0vous donnera le nom de fichier python en cours d'exécution. Tout index après cela est les arguments passés.

allsyed
la source
6

Si vous l'appelez comme ceci: $ python myfile.py var1 var2 var3

import sys

var1 = sys.argv[1]
var2 = sys.argv[2]
var3 = sys.argv[3]

Semblable aux tableaux que vous avez également, sys.argv[0]qui est toujours le répertoire de travail actuel.

lvadim01
la source
6
sys.argv[0]n'est pas le répertoire de travail actuel. Il s'agit du nom du fichier en cours d'exécution.
regardez
5

Quelques choses supplémentaires auxquelles je peux penser.

Comme @allsyed l'a dit, sys.argv donne une liste de composants (y compris le nom du programme), donc si vous voulez connaître le nombre d'éléments passés par la ligne de commande, vous pouvez utiliser len () pour le déterminer. Sur cette base, vous pouvez concevoir des messages d'exception / d'erreur si l'utilisateur n'a pas transmis un nombre spécifique de paramètres.

Aussi, si vous cherchez une meilleure façon de gérer les arguments de la ligne de commande, je vous suggère de consulter https://docs.python.org/2/howto/argparse.html

Rohan Sadale
la source