web-dev-qa-db-fra.com

Comment utiliser python argparse avec des arguments autres que sys.argv?

J'ai parcouru toute la documentation et il semble qu'il n'y ait aucun moyen de le faire, mais:

Existe-t-il un moyen d'utiliser argparse avec n'importe quelle liste de chaînes, au lieu de seulement avec sys.argv?

Voici mon problème: j'ai un programme qui ressemble à ceci:

# This file is program1.py
import argparse

def main(argv):
    parser = argparse.ArgumentParser()
    # Do some argument parsing

if __name__ == '__main__':
    main(sys.argv)

Cela fonctionne bien lorsque ce programme est appelé directement à partir de la ligne de commande. Cependant, j'ai un autre script python qui exécute des versions par lots de ce script avec différents arguments de ligne de commande, que j'utilise comme ceci:

import program1

arguments = ['arg1', 'arg2', 'arg3']
program1.main(arguments)

Je veux toujours pouvoir analyser les arguments, mais argparse utilise automatiquement par défaut sys.argv au lieu des arguments que je lui donne. Existe-t-il un moyen de passer la liste des arguments au lieu d'utiliser sys.argv?

19
ClydeTheGhost

Vous pouvez transmettre une liste de chaînes à parse_args:

parser.parse_args(['--foo', 'FOO'])
13
iCart

Changez simplement le script par défaut en sys.argv[1:] et analyser les arguments en omettant le premier (qui est le nom de la commande invoquée)

import argparse,sys

def main(argv=sys.argv[1:]):
    parser = argparse.ArgumentParser()
    # Do some argument parsing
    args = parser.parse_args(argv)

if __name__ == '__main__':
    main()

Ou, si vous ne pouvez pas omettre le premier argument:

import argparse,sys

def main(args=None):
    # if None passed, uses sys.argv[1:], else use custom args
    parser = argparse.ArgumentParser()
    parser.add_argument("--level", type=int)
    args = parser.parse_args(args)

    # Do some argument parsing

if __name__ == '__main__':
    main()

Dernier: si vous ne pouvez pas changer le programme appelé, vous pouvez toujours faire quelque chose

Supposons que le programme que vous ne pouvez pas modifier s'appelle argtest.py (J'ai ajouté un appel pour imprimer les arguments)

Ensuite, changez simplement la valeur locale argv de argtest.sys module:

import argtest
argtest.sys.argv=["dummy","foo","bar"]
argtest.main()

production:

['dummy', 'foo', 'bar']    
5