如何在Python中将整个列表作为命令行参数传递?

yog*_*esh 19 python

我试图传递两个包含整数作为python代码参数的列表.但是sys.argv[i]将参数作为字符串列表获取.

输入看起来像,

$ python filename.py [2,3,4,5] [1,2,3,4]
Run Code Online (Sandbox Code Playgroud)

我发现以下黑客转换列表.

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]
Run Code Online (Sandbox Code Playgroud)

有一个更好的方法吗?

Mis*_*agi 51

不要重新发明轮子.使用argparse模块,显式并传入实际的参数列表

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)
Run Code Online (Sandbox Code Playgroud)

然后你可以使用它来调用它

$ 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]
Run Code Online (Sandbox Code Playgroud)

  • @MisterMiyagi 蜡上蜡脱 (3认同)

Jos*_*h J 14

命令行参数始终作为字符串传递.您需要自己将它们解析为所需的数据类型.

>>> 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'>)
Run Code Online (Sandbox Code Playgroud)

它们是像argparseclick这样的库,可以让你定义自己的参数类型转换,但是argparse对待"[2,3,4]"它们同样[ 2 , 3 , 4 ]如此我怀疑它会有用.

编辑2019年1月这个答案似乎还有一些动作,所以我将添加另一个直接从argparse文档中获取的选项.

您可以使用action=append允许将重复的参数收集到单个列表中.

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您将为--foo ?每个列表项传递一次.使用OP示例:python filename.py --foo 2 --foo 3 --foo 4 --foo 5会导致foo=[2,3,4,5]


idj*_*jaw 10

我在最后测试了这个,我的输入看起来像这样:

python foo.py "[1,2,3,4]" "[5,6,7,8,9]"
Run Code Online (Sandbox Code Playgroud)

我正在做以下事情来转换两个感兴趣的参数:

import ast
import sys

list1 = ast.literal_eval(sys.argv[1])
list2 = ast.literal_eval(sys.argv[2])
Run Code Online (Sandbox Code Playgroud)

  • 抛出 `ValueError: 格式错误的节点或字符串: &lt;_ast.Name object at 0x0000024929290518&gt;`,我的参数是 `"[n01530575,n01530576]"` (4认同)

pos*_*ich 7

为什么不:

python foo.py 1,2,3,4 5,6,7,8  
Run Code Online (Sandbox Code Playgroud)

比试图评估python更简洁,并且不要求你的用户知道python格式.

import sys

list1 = sys.argv[1].split(',')
list2 = [int(c) for c in sys.argv[2].split(',')]  # if you want ints
Run Code Online (Sandbox Code Playgroud)


小智 7

您可以简单地使用nargs='+'argparse 选项

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])
Run Code Online (Sandbox Code Playgroud)

然后您可以像这样传递参数:

python your_file.py --myarg 1 2 3
Run Code Online (Sandbox Code Playgroud)

这将作为 [1,2,3] 存储在您的程序中的 myarg 中

print(myarg)
Run Code Online (Sandbox Code Playgroud)

输出:

[1,2,3]
Run Code Online (Sandbox Code Playgroud)


aka*_*uko 6

您还可以执行以下操作:

说,你有foo.py

import json
import sys
data = json.loads(sys.argv[1])
print data, type(data)
Run Code Online (Sandbox Code Playgroud)

然后,如果您将上述运行为: python foo.py "[1,2,3]"

输出:

[1, 2, 3] <type 'list'>

  • 它刺痛`json.decoder.JSONDecodeError:期望值:第1行第2列(字符1)` (3认同)

Ily*_*rov 5

不,无法在命令行参数中传递列表。命令行参数始终是字符串。但有更好的方法将其转换为列表。你可以这样做:

import ast

A = ast.literal_eval(strA)
B = ast.literal_eval(strB)
Run Code Online (Sandbox Code Playgroud)