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

时间:2010-01-18 14:13:45

标签: python

我使用getopt来处理命令行可选参数,该参数应接受列表。像这样:

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

但是这会在“[1,”

之后修剪一切

我的问题是: A)有没有办法指定列表而不将其转换为字符串? (使用getopt)

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

谢谢

6 个答案:

答案 0 :(得分:26)

我可以想到两个选项:

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

答案 1 :(得分: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

答案 2 :(得分:7)

也许你应该把参数括在引号中?

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

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

答案 3 :(得分:3)

更新的方法是使用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

答案 4 :(得分: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"

答案 5 :(得分:0)

我已从重复问题重定向:
How to pass an array to python through command line - Stack Overflow

我正在回答这个问题:
命令行中的参数是字符串,它们不像程序中的文字一样被解析 argv从命令行参数自动构造字符串到列表中(以空格分隔),简而言之, sys.argv是一个列表。

    from sys import argv
    cmd = "arr = {sys.argv[1]}".format(argv)
    exec(cmd)
    print(arr[2])