【发布时间】:2020-06-30 19:04:26
【问题描述】:
我需要通过命令行将字典传递给 python 模块。我还没有找到让 Python 合作的方法。以下是我想要完成的一个非常简化的示例。这会产生以下错误TypeError: _get_positional_kwargs() missing 1 required positional argument: 'dest'
。在 add_argument 行中添加 dest 参数会导致 TypeError: __init__() got an unexpected keyword argument 'kwargs',这表明 argparse 可能根本不会将字典作为参数。 pickle 文件真的是在命令行调用中来回传递字典的唯一选择吗?
def run(**kwargs):
for i in kwargs.items():
print(f'{i}: {kwargs[i]}')
# ...some code to manipulate the dictionary
return kwargs
if __name__ == "__main__":
import argparse
parser = argparse.ArgumentParser(description="Test script")
parser.add_argument(kwargs='**', description='A dictionary to be manipulated and returned')
args = parser.parse_args()
x = run(args)
pass
其他信息 - 我知道我可以使用包含空格分隔参数的命令行将列表传递给 *nargs 参数,但我需要对字典执行类似操作。
更新 - 工作原理: 根据@chepner 的有用输入,我能够让它与他在回答中提到的 json 解决方案一起工作。在我的 Windows 平台上,我确实必须从字典字符串中删除所有空格,并且最终命令行字符串中需要转义字符。
{\"this\":1,\"is\":2,\"a\":5,\"dictionary\":7}
【问题讨论】:
-
“向 add_argument 行添加
dest参数” - 我在您的代码中没有看到任何名为dest的参数。您正在尝试传递一个名为kwargs的参数,但调用者无法直接访问它。您必须像使用description="thing"一样传递kwargs。 -
add_argument()至少需要一个位置参数。您想要实现什么,您希望传递给run()的字典的键和值包含什么? -
您能否添加一个模块的命令行调用示例,帮助我们了解您想要做什么?
-
命令行参数示例可能类似于:
C:\Python37\python.exe test.py -this 1 -is 2 -a 3 -dictionary 4。在正常情况下,我会传递数百甚至数千个键值对。命令行调用将由代码生成。 -
可能无法传递数千个参数,具体取决于您的操作系统。
标签: python dictionary argparse keyword-argument