我使用getopt来处理命令行可选参数,该参数应接受列表。像这样:
foo.py --my_list=[1, 2, 3, 4,5]
但是这会在“[1,”
之后修剪一切我的问题是: A)有没有办法指定列表而不将其转换为字符串? (使用getopt)
B)如果我要将列表转换为字符串,如何将此列表转换为字符串?例如像mylist.split(“?”)之类的东西摆脱方括号?有更好的方法吗?
谢谢
答案 0 :(得分: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'
等转换为整数(非常简单)。
答案 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])