Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use python argparse with args other than sys.argv?

Is there a way to use argparse with any list of strings, instead of only with sys.argv?

Here's my problem: I have a program which looks something like this:

# This file is program1.py
import argparse

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

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

This works fine when this program is called straight from the command line. However, I have another python script which runs batch versions of this script with different commandline arguments, which I'm using like this:

import program1

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

I still want to be able to parse the arguments, but argparse automatically defaults to using sys.argv instead of the arguments that I give it. Is there a way to pass in the argument list instead of using sys.argv?

like image 291
ClydeTheGhost Avatar asked Aug 09 '16 14:08

ClydeTheGhost


People also ask

Does Argparse use SYS argv?

Python argparse The argparse module makes it easy to write user-friendly command-line interfaces. It parses the defined arguments from the sys. argv . The argparse module also automatically generates help and usage messages, and issues errors when users give the program invalid arguments.

How do you add arguments in Argparse?

After importing the library, argparse. ArgumentParser() initializes the parser so that you can start to add custom arguments. To add your arguments, use parser. add_argument() .

What is Argparse ArgumentParser ()?

The argparse module provides a convenient interface to handle command-line arguments. It displays the generic usage of the program, help, and errors. The parse_args() function of the ArgumentParser class parses arguments and adds value as an attribute dest of the object.


2 Answers

You can pass a list of strings to parse_args:

parser.parse_args(['--foo', 'FOO'])
like image 199
iCart Avatar answered Oct 20 '22 06:10

iCart


Just change the script to default to sys.argv[1:] and parse arguments omitting the first one (which is the name of the invoked command)

import argparse,sys

def main(argv=sys.argv[1:]):
    parser = argparse.ArgumentParser()
    parser.add_argument("--level", type=int)
    args = parser.parse_args(argv)

if __name__ == '__main__':
    main()

Or, if you cannot omit the first 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()

Last one: if you cannot change the called program, you can still do something

Let's suppose the program you cannot change is called argtest.py (I added a call to print arguments)

Then just change the local argv value of the argtest.sys module:

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

output:

['dummy', 'foo', 'bar']    
like image 26
Jean-François Fabre Avatar answered Oct 20 '22 05:10

Jean-François Fabre