36

I want to use the pythons argparse module to parse my cli parameter string. This works for the parameters a pass from terminal, but not with a given string.

import argparse

parser = argparse.ArgumentParser(description='Argparse Test script')
parser.add_argument("param", help='some parameter')

argString = 'someTestFile'
print(argString)

args = parser.parse_args(argString)

If I run this script I get this output:

~/someTestFile
usage: argparsetest.py [-h] param
argparsetest.py: error: unrecognized arguments: o m e T e s t F i l e

The ~/someTestFile is somehow transformed in o m e T e s t F i l e. As already mentioned, it works if I pass the filename from the terminal.

I could imagine, that this has something to do with string encodings. Does someone has an idea how to fix this?

1

4 Answers 4

60

Another option is to use shlex.split. It it especially very convenient if you have real CLI arguments string:

import shlex
argString = '-vvvv -c "yes" --foo bar --some_flag'
args = parser.parse_args(shlex.split(argString))
Sign up to request clarification or add additional context in comments.

Comments

35

parser.parse_args() expects a sequence in the same form as sys.argv[1:]. If you treat a string like a sys.argv sequence, you get ['s', 'o', 'm', 'e', 'T', 'e', 's', 't', 'F', 'i', 'l', 'e']. 's' becomes the relevant argument, and then the rest of the string is unparseable.

Instead, you probably want to pass in parser.parse_args(['someTestFile'])

Comments

7

Just like the default sys.argv is a list, your arguments have to be a list as well.

args = parser.parse_args([argString])

Comments

6

Simply split your command string :

args = parser.parse_args(argString.split())

A complete example to showcase :

import argparse

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('--dummy_opt', nargs='*', type=int, help='some ids')
    argString = "--dummy_opt 128 128"

    args = parser.parse_args(argString.split())

    print(args)

will output :

Namespace(pic_resize=[128, 128])

1 Comment

This is not working for arguments with spaces.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.