我使用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
我能想到两个选项:
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'等等,为整数(很容易为好).
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
也许你应该把参数括在引号中?
foo.py "--my_list=[1, 2, 3, 4,5]"
Run Code Online (Sandbox Code Playgroud)
否则,每个空格都将被视为参数的分隔符.
更新的方法是使用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)