2010-01-18 113 views
17

我正在使用getopt来处理命令行可选参数,它应该接受一个列表。事情是这样的:指定一个列表作为python中的命令行参数

foo.py --my_list=[1, 2, 3, 4,5] 

但这修剪后 “[1,” 一切

我的问题是: A)有没有它转换成字符串来指定列表的方式吗? (使用getopt)

B)如果我要将列表转换为字符串,如何将此列表转换为字符串?例如像mylist.split(“?”)来摆脱方括号?有没有更好的办法?

谢谢

回答

23

有迹象表明,我能想到的两个选项:

  • 使用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'等转换为整数(非常简单)。

+2

因为这篇文章是5岁,'optparse'现在已被弃用''argparse' – SAAD 2015-09-04 13:06:43

+0

你是什么意思'使用append行动'?这听起来令人兴奋,但不确定你在说什么。 – 2017-06-03 02:06:48

+0

@MonicaHeddneck请参阅https://docs.python.org/3/library/optparse.html#standard-option-actions - 他们有一个“append”动作的例子:'parser.add_option(“ - t”,“ --tracks“,action =”append“,type =”int“)'。 – 2017-06-03 04:28:55

7

也许你应该只是将引数括在引号中?

foo.py "--my_list=[1, 2, 3, 4,5]" 

否则,每个空间将被视为参数的分隔符。

+2

而这还不是蟒蛇,因为但由于其解析这些参数,并将其提供给Python程序外壳。 – extraneon 2010-01-18 14:29:02

+1

部分属实。在Windows上,命令行只是一个字符串。即使UNIX没有任何将参数传递给程序的特殊数据结构,它仍然只是一个字符串。但是,这是一个广泛实施的惯例,但并不普遍。是的,C运行时具有这方面的规格。 – Joey 2010-01-18 14:33:10

+1

您也可以执行'--my-list =“[1,2,3,4,5]”'。我通常使用这种形式,因为它通常就像'--my-list =“$ MY_LIST”'。 – 2010-01-18 14:43:14

1

从Python optparse的帮助页面: “

parser.add_option("-f") 
parser.add_option("-p", type="float", nargs=3, dest="point") 

在解析命令行

-f foo.txt -p 1 -3.5 4 -fbar.txt 

optparse将设置

options.f = "foo.txt" 
options.point = (1.0, -3.5, 4.0) 
options.f = "bar.txt" 

10

如果我不能用一个标准的解析器(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功能和插入表作为一串代码,我们有理想的结果。

相关链接:

Using python's eval() vs. ast.literal_eval()?

http://docs.python.org/2/library/functions.html?highlight=eval#eval

1

更新的方法是使用argparse库并添加列表作为命令行参数。这样,您不必进行任何手动解析。

例子:

parser = argparse.ArgumentParser() 
parser.add_argument(
     "-values", 
     nargs="*", # expects ≥ 0 arguments 
     type=int, 
     default=[35, 40, 50, 60, 70, 80, 90], # default list if no arg value 
    ) 

,你会再打电话这样的:

python3 someprogram.py -values 1 2 3 
相关问题