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

cpp*_*ppb 21 python

我使用getopt来处理命令行可选参数,它应该接受一个列表.像这样的东西:

foo.py --my_list=[1, 2, 3, 4,5] 
Run Code Online (Sandbox Code Playgroud)

但是这会在"[1"之后修剪一切

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

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

谢谢

Alo*_*hal 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'等等,为整数(很容易为好).

  • 由于这篇文章已有5年历史,``optparse`现已弃用于`argparse` (4认同)

fun*_*unk 11

如果我不能使用标准解析器(optparse或argparse)到我的应用程序,那么我使用ast.literal_eval函数来解析类型列表的输入参数,如下所示:

import sys, ast

inputList = ast.literal_eval( sys.argv[1] )
print type( inputList )
print inputList
Run Code Online (Sandbox Code Playgroud)

假设此代码存储在testParser.py文件中.通过执行脚本:

$ python testParser.py  "[1,2,3,4, [123, 456, 789], 'asdasd']"
Run Code Online (Sandbox Code Playgroud)

我们得到以下输出:

<type 'list'>
[1, 2, 3, 4, [123, 456, 789], 'asdasd']
Run Code Online (Sandbox Code Playgroud)

因此,使用足够安全的ast.literal_eval函数并将列表作为一串代码插入,我们得到了理想的结果.

有用的链接:

使用python的eval()与ast.literal_eval()?

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


Joe*_*oey 7

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

foo.py "--my_list=[1, 2, 3, 4,5]"
Run Code Online (Sandbox Code Playgroud)

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

  • 这不是因为python而是因为shell解析了参数并将它们提供给python程序. (2认同)

Nic*_*dey 6

更新的方法是使用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
    )
Run Code Online (Sandbox Code Playgroud)

然后你会这样称呼它:

python3 someprogram.py -values 1 2 3
Run Code Online (Sandbox Code Playgroud)