我试图将包含整数的两个列表作为参数传递给python代码。但是sys.argv[i]
将参数作为字符串列表获取。
输入看起来像,
$ python filename.py [2,3,4,5] [1,2,3,4]
我发现以下黑客转换列表。
strA = sys.argv[1].replace('[', ' ').replace(']', ' ').replace(',', ' ').split()
strB = sys.argv[2].replace('[', ' ').replace(']', ' ').replace(',', ' ').split()
A = [float(i) for i in strA]
B = [float (i) for i in strB]
有更好的方法吗?
答案 0 :(得分:35)
不要重新发明轮子。使用argparse module,明确并传递实际的参数列表
import argparse
# defined command line options
# this also generates --help and error handling
CLI=argparse.ArgumentParser()
CLI.add_argument(
"--lista", # name on the CLI - drop the `--` for positional/required parameters
nargs="*", # 0 or more values expected => creates a list
type=int,
default=[1, 2, 3], # default if nothing is provided
)
CLI.add_argument(
"--listb",
nargs="*",
type=float, # any type/callable can be used here
default=[],
)
# parse the command line
args = CLI.parse_args()
# access CLI options
print("lista: %r" % args.lista)
print("listb: %r" % args.listb)
然后您可以使用
进行调用$ python my_app.py --listb 5 6 7 8 --lista 1 2 3 4
lista: [1, 2, 3, 4]
listb: [5.0, 6.0, 7.0, 8.0]
答案 1 :(得分:11)
命令行参数始终作为字符串传递。您需要自己将它们解析为所需的数据类型。
\\name\{\1\}
他们是像argparse和click这样的库,可让您定义自己的参数类型转换,但>>> input = "[2,3,4,5]"
>>> map(float, input.strip('[]').split(','))
[2.0, 3.0, 4.0, 5.0]
>>> A = map(float, input.strip('[]').split(','))
>>> print(A, type(A))
([2.0, 3.0, 4.0, 5.0], <type 'list'>)
将argparse
视为"[2,3,4]"
{{1} }} [
2
,
3
,
所以我怀疑它会有用。
编辑2019年1月这个答案似乎还有一些动作,所以我将直接从argparse docs中添加另一个选项。
您可以使用4
将重复的参数收集到一个列表中。
]
在这种情况下,您将为每个列表项传递action=append
一次。使用OP示例:>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
会产生--foo ?
答案 2 :(得分:7)
我测试了这个,我的输入看起来像这样:
python foo.py "[1,2,3,4]" "[5,6,7,8,9]"
我正在做以下事情来转换感兴趣的两个参数:
import ast
import sys
list1 = ast.literal_eval(sys.argv[1])
list2 = ast.literal_eval(sys.argv[2])
答案 3 :(得分:6)
为什么不:
python foo.py 1,2,3,4 5,6,7,8
比试图评估python更简洁,并且不要求你的用户知道python格式。
import sys
list1 = sys.argv[1].split(',')
list2 = [int(c) for c in sys.argv[2].split(',')] # if you want ints
答案 4 :(得分:3)
您还可以执行以下操作:
说,你有foo.py
:
import json
import sys
data = json.loads(sys.argv[1])
print data, type(data)
然后,如果您将上述内容运行为:python foo.py "[1,2,3]"
输出:
[1, 2, 3] <type 'list'>
答案 5 :(得分:2)
你必须逃脱:
python some.py \[2,3,4,5\] \[1,2,3,4\]
some.py
import sys
print sys.argv[1]
print sys.argv[2]
这给了我:
[2,3,4,5]
[1,2,3,4]
<强>更新强>:
import sys
import ast
d = ast.literal_eval(sys.argv[1])
b = ast.literal_eval(sys.argv[2])
for a in d:
print a
for e in b:
print e
首先会给出:
2
3
4
5
,第二个将给出
1
2
3
4
答案 6 :(得分:1)
不,没有办法在命令行参数中传递列表。命令行参数始终是字符串。但是有一种更好的方法可以将其转换为列表。你可以这样做:
import ast
A = ast.literal_eval(strA)
B = ast.literal_eval(strB)
答案 7 :(得分:0)
你可以简单地使用 argparse 的 nargs='+'
选项
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--myarg', dest='myarg', required=False, help='--myarg 100 100 100 takes a list of 3 elements, each is of value 100 ', nargs='+', type=int, default=[100,100,100])
然后你可以像这样传递参数:
python your_file.py --myarg 1 2 3
这将在你的程序中以 [1,2,3] 的形式存储在 myarg 中
print(myarg)
输出:
[1,2,3]