Python将用户参数作为列表

时间:2017-08-24 08:31:33

标签: python

我编写了一个python脚本来获取用户的输入,但是用户输入会被“,”拆分。我不希望用户输入被修改。

#!/usr/bin/python
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-f","--file_name", type=str)
parser.add_argument("-i", "--ingress",type=list)
args = parser.parse_args()
print args.file_name
print args.ingress
print(type(args.ingress))

输出:

./input_parse.py -f output.txt -i [["1,2,3,4"],80,90,"tcp"]
output.txt
['[', '[', '1', ',', '2', ',', '3', ',', '4', ']', ',', '8', '0', ',', '9', '0', ',', 't', 'c', 'p', ']']
<type 'list'>

预期产出:

output.txt
[["1,2,3,4"],80,90,"tcp"]
<type 'list'>

稍后我需要遍历列表并获取列表[0],列表[1]等等。

1 个答案:

答案 0 :(得分:1)

参数解析器将所有内容作为字符串,然后应用您在输入中指定的type。如果你真的需要传递一个列表,只需转换回str并将其转换为带有辅助函数的列表:

选项1:

你可以这样做:

#!/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)

然后传递这样的论点:

python /tmp/test.py -f output.txt -i "1,2,3,4|80,90,tcp"

输出将按预期显示:

output.txt
1,2,3,4|80,90,tcp
<type 'str'>
[['1,2,3,4'], 80, 90, 'tcp']
<type 'list'>

选项2:

这也可以更改为列表:

#!/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)

你这样称呼它:

python /tmp/test.py -f output.txt -i [["1,2,3,4"],80,90,"tcp"]

输出:

output.txt
[[1,2,3,4],80,90,tcp]
<type 'str'>
[['1,2,3,4'], 80, 90, 'tcp']
<type 'list'>

选项3:

使用ast.literal_eval(比eval更危险,因为任何人都可以将代码注入您的程序并可能损害您的系统):

#!/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)

致电:

python /tmp/test.py -f output.txt -i '[["1,2,3,4"],80,90,"tcp"]'

输出:

output.txt
[["1,2,3,4"],80,90,"tcp"]
<type 'str'>
[['1,2,3,4'], 80, 90, 'tcp']
<type 'list'>