30

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?

thorink
  • 704
  • 1
  • 8
  • 21
  • you may want to take a look at the [argparse documentation](http://docs.python.org/library/argparse.html#parsing-arguments). – Rik Poggi Jan 16 '12 at 10:19

4 Answers4

56

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))
Serge
  • 1,947
  • 3
  • 26
  • 48
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'])

Preethi Vaidyanathan
  • 1,203
  • 1
  • 12
  • 32
Devin Jeanpierre
  • 92,913
  • 4
  • 55
  • 79
7

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])

mxdbld
  • 16,747
  • 5
  • 34
  • 37
7

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

args = parser.parse_args([argString])
yak
  • 8,851
  • 2
  • 29
  • 23