如何向Python传递二维参数列表?argparse传参报错求助
问题原因及解决办法
问题原因
- 你没有给
argparse定义任何接收参数的选项,所以args只是一个空的Namespace对象,自然没法当作可迭代对象处理 - 终端直接输入
([[1,4], [2,2], [4,7], [6,3]])这种Python语法结构时,shell会把它当作普通字符串传递,argparse不会自动将其解析为Python列表/数组
解决办法
这里提供两种实用方案:
方案一:传递字符串形式的数组,用ast.literal_eval解析
修改代码,先给argparse添加参数定义,再将传入的字符串解析为Python列表,最后转成numpy数组:
import matplotlib.pyplot as plt import numpy as np import argparse import ast # 安全解析字符串形式的Python结构 # 定义参数解析器 parser = argparse.ArgumentParser(description='传递二维坐标数组') # 添加位置参数,接收字符串形式的数组 parser.add_argument('points', help='输入二维坐标数组,格式类似 [[1,4],[2,2],[4,7],[6,3]]') args = parser.parse_args() # 解析字符串为Python列表,再转成numpy数组 data = np.array(ast.literal_eval(args.points)) x, y = data.T print(data) # 后续可正常绘图 plt.scatter(x, y) plt.show()
终端运行命令(注意用引号包裹数组字符串,避免shell解析特殊字符):
python multi_point.py "[[1,4], [2,2], [4,7], [6,3]]"
方案二:传递扁平化数值,再重组为二维数组
如果觉得输入字符串数组麻烦,可以把所有坐标值用空格分隔传递,代码里再重新组织成二维数组:
import matplotlib.pyplot as plt import numpy as np import argparse parser = argparse.ArgumentParser(description='传递扁平化的坐标数值') # 接收任意数量的浮点/整数参数 parser.add_argument('coords', nargs='+', type=float, help='输入所有坐标值,格式如 1 4 2 2 4 7 6 3') args = parser.parse_args() # 把扁平化数值重组为n行2列的数组 data = np.array(args.coords).reshape(-1, 2) x, y = data.T print(data) plt.scatter(x, y) plt.show()
终端运行命令:
python multi_point.py 1 4 2 2 4 7 6 3
注意事项
- 方案一中必须用引号包裹数组字符串,否则shell会把
[、]等字符当作特殊符号处理,导致参数传递错误 - 方案二中要确保传递的数值总数是偶数,否则
reshape(-1,2)会报错
内容的提问来源于stack exchange,提问作者James-Jesse Drinkard
相关产品推荐
相关产品推荐

