2017-07-12 1 views
1

Je suis en train d'utiliser le module argparse pour extraire les arguments de celle-ci, mais la mise en œuvre naïve ne réussit pas lorsqu'il est appelé avec l'interpréteur python:Python argparse lorsqu'il est invoqué de python intepreter

1 import argparse 
    2 import sys 
    3 
    4 parser = argparse.ArgumentParser(description="some test program") 
    5 parser.add_argument('--some-option', action="store", dest="some_option") 
    6 
    7 parsed_args = parser.parse_args(sys.argv) 
    8 print(vars(parsed_args) 

Il échoue parce qu'il détecte le premier argument que le nom du script - dans ce cas « test.py »:

~$: python3 ./test.py --some-option=5 
usage: test.py [-h] [--some-option INPUT] 
test.py: error: unrecognized arguments: ./test.py 

la solution que j'ai trouvé à l'heure actuelle est de rechercher et de supprimer les scripts python nom des arugments, mais cela semble comme un hack unelegant, et aura des problèmes si le premier argument peut légitimer imately un fichier python:

1 import argparse 
    2 import sys 
    3 
    4 parser = argparse.ArgumentParser(description="some test program") 
    5 parser.add_argument('--some-option', action="store", dest="some_option") 
    6 
    7 print(sys.argv) 
    8 if sys.argv[0].find('.py') != -1: 
    9  args = sys.argv[1:] 
10 else: 
11  args = sys.argv 
12 
13 parsed_args = parser.parse_args(args) 
14 print(vars(parsed_args) 

Y at-il une meilleure façon de se débarrasser de ce nom de fichier python satanés lors de l'utilisation argparse

Note: Je ne peux pas me débarrasser de l'appel à la intepreter parce que cela fait partie d'un système de construction multi-plateforme, et a donc un makefile qui définit l'exécutable python à python3 ou python3.exe en fonction du système d'exploitation.

Répondre

1

sys.argv[0] est toujours le nom du fichier. Donc, si vous faites parsed_args = parser.parse_args(sys.argv[1:]), vous pouvez être sûr que vous ignorerez toujours le nom du fichier.

par le python documentation:

sys.argv La liste des arguments de ligne de commande passée à un script Python. argv [0] est le nom du script (il est un système d'exploitation dépend si ce est un chemin complet ou non). Si la commande a été exécutée en utilisant l'option de ligne de commande -c pour l'interpréteur, argv [0] est défini sur la chaîne '-c'. Si aucun nom de script n'a été transmis à l'interpréteur Python, argv [0] correspond à la chaîne vide.

+0

Vous avez raison. J'avais supposé que si vous invoquiez le script directement, il n'aurait pas le script python comme argument de sys.argv - mais bien sûr, les concepteurs de python sont des gens intelligents ..... – sdfgeoff