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?
Vous pouvez transmettre une liste de chaînes à parse_args
:
parser.parse_args(['--foo', 'FOO'])
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']