在Python中将列表作为命令行参数指定
我正在使用getopt来处理命令行中的可选参数,这个参数应该接受一个列表。就像这样:
foo.py --my_list=[1, 2, 3, 4,5]
但是这样处理后,"[1,"后面的内容就被删掉了。
我有几个问题: A) 有没有办法在不把列表转换成字符串的情况下指定一个列表?(使用getopt)
B) 如果我必须把列表转换成字符串,应该怎么做呢?比如像mylist.split("?")这样来去掉方括号,有没有更好的方法?
谢谢
6 个回答
7
也许你应该把这个参数用引号括起来?
foo.py "--my_list=[1, 2, 3, 4,5]"
否则每个空格都会被当作参数的分隔符。
14
如果我不能使用标准的解析器(比如optparse或argparse)来处理我的应用程序,那么我会使用ast.literal_eval这个函数来解析输入的列表类型参数,方法如下:
import sys, ast
inputList = ast.literal_eval( sys.argv[1] )
print type( inputList )
print inputList
假设这段代码保存在testParser.py文件中。通过执行这个脚本:
$ python testParser.py "[1,2,3,4, [123, 456, 789], 'asdasd']"
我们会得到以下输出:
<type 'list'>
[1, 2, 3, 4, [123, 456, 789], 'asdasd']
所以,使用足够安全的ast.literal_eval函数,并把列表作为代码字符串插入,我们就得到了想要的结果。
有用的链接:
使用Python的eval()和ast.literal_eval()有什么区别?
http://docs.python.org/2/library/functions.html?highlight=eval#eval
29
我想到两种方法:
- 使用 optparse,并用
append
动作来指定你想做的事情,比如这样写:foo.py --my_list=1 --my_list=2 ...
。 - 把命令行写成
foo.py --my_list='1,2,3,4,5'
,然后用x.split(',')
来把这些值分开,放到一个列表里。你可以用getopt
或optparse
来实现这个方法。
第一种方法的好处是,你可以直接把整数放到列表里,但命令行会比较长(不过如果需要的话,你可以为 --my_list
加一个单字符的选项)。第二种方法的好处是命令行比较短,但在用 split()
之后,你需要把字符串值 '1'
、'2'
等转换成整数(这也很简单)。