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

2024-05-14 11:32:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图将两个包含整数的列表作为参数传递给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]

有更好的办法吗?


Tags: 字符串代码in列表for参数sys整数
3条回答

我在我的终端上测试了这个,我的输入如下:

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])

不要重新发明轮子。使用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]

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

>>> 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'>)

它们是像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'])

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

相关问题 更多 >

    热门问题