The argument parser, takes everything as a string then applies the type
you specified on the input. If you really need to pass a list, just convert back to a str
and convert it to a list with a helper function:
Option 1:
you could do something like this:
#!/usr/bin/python
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-f","--file_name", type=str)
parser.add_argument("-i", "--ingress",type=str)
args = parser.parse_args()
print args.file_name
print args.ingress
print(type(args.ingress))
def helper(x):
l = x.split('|')
ll = [[l[0]]]+l[1].split(',')
ll[1], ll[2] = int(ll[1]), int(ll[2])
return ll
args.ingress = helper(args.ingress)
print args.ingress
print type(args.ingress)
And then pass the argument like this:
python /tmp/test.py -f output.txt -i "1,2,3,4|80,90,tcp"
The output will look as you expect it:
output.txt
1,2,3,4|80,90,tcp
<type 'str'>
[['1,2,3,4'], 80, 90, 'tcp']
<type 'list'>
Option 2:
This can also be changed to take a list:
#!/usr/bin/python
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-f","--file_name", type=str)
parser.add_argument("-i", "--ingress",type=str)
args = parser.parse_args()
print args.file_name
print args.ingress
print(type(args.ingress))
def helper(x):
l = x.split(']')
l[0] = l[0].replace('[[','')
l = l[:2]
ll = [[l[0]]]+l[1].split(',')[1:]
ll[1], ll[2] = int(ll[1]), int(ll[2])
return ll
args.ingress = helper(args.ingress)
print args.ingress
print type(args.ingress)
You call it like this:
python /tmp/test.py -f output.txt -i [["1,2,3,4"],80,90,"tcp"]
output:
output.txt
[[1,2,3,4],80,90,tcp]
<type 'str'>
[['1,2,3,4'], 80, 90, 'tcp']
<type 'list'>
Option 3:
Use ast.literal_eval
(which is dangerous than eval
, as anyone can inject code into your program and potentially harm your system):
#!/usr/bin/python
import ast
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-f","--file_name", type=str)
parser.add_argument("-i", "--ingress",type=str)
args = parser.parse_args()
print args.file_name
print args.ingress
print(type(args.ingress))
args.ingress = ast.literal_eval(args.ingress)
print args.ingress
print type(args.ingress)
call:
python /tmp/test.py -f output.txt -i '[["1,2,3,4"],80,90,"tcp"]'
output:
output.txt
[["1,2,3,4"],80,90,"tcp"]
<type 'str'>
[['1,2,3,4'], 80, 90, 'tcp']
<type 'list'>