在Python中将列表作为命令行参数指定

23 投票
6 回答
48376 浏览
提问于 2025-04-15 18:09

我正在使用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(',') 来把这些值分开,放到一个列表里。你可以用 getoptoptparse 来实现这个方法。

第一种方法的好处是,你可以直接把整数放到列表里,但命令行会比较长(不过如果需要的话,你可以为 --my_list 加一个单字符的选项)。第二种方法的好处是命令行比较短,但在用 split() 之后,你需要把字符串值 '1''2' 等转换成整数(这也很简单)。

撰写回答