如何将字典作为命令行参数传递给Python脚本?

2024-03-29 10:36:08 发布

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

如何将字典作为命令行参数传递给Python脚本? 我需要得到字典,其中键是字符串,值是一些元素的列表 –例如,看起来像:

command_line_arguments = {"names" : ["J.J.", "April"], "years" : [25, 29]}

我已经试过了

if __name__ == '__main__':
    args = dict([arg.split('=') for arg in sys.argv[2:]]) # also tried with 1 but doesn't work
    main(args)

我把脚本称为

$ python saver.py names=["J.J.", "April"] years=[25, 29]

但它不起作用,字典的长度为0,需要2。有谁能帮我在main中传递和创建字典吗


Tags: 字符串命令行脚本元素列表字典namesmain
3条回答

我从@chander的优秀答案开始,但在shell/命令级别和python脚本中遇到了特殊字符转义的问题。将JSON保存到一个文件中,然后将该文件名作为参数传递给脚本是一个可能的解决方案,但在我的情况下,这将相当复杂

因此,我决定在参数级别对字符串进行url编码,并在Python脚本中对其进行解码。这意味着无论调用python脚本的是什么,都需要对命令行参数进行url编码,该参数是JSON字符串。有许多online tools允许您使用url编码字符串进行沙箱处理。在我的例子中,nodejs脚本调用python脚本调用,并且可以轻松地对JSON进行url编码

Python脚本中,它看起来是这样的(您不必使用argparse,但我喜欢它):

import json
import argparse
from urllib.parse import unquote

# Set up CLI Arguments
parser = argparse.ArgumentParser()

# Required Arguments
parser.add_argument("-c", "--config", required=True,
                    help="JSON configuration string for this operation")

# Grab the Arguments
args = parser.parse_args()

jsonString = unquote(args.config)

print(jsonString)

config = json.loads(jsonString)

print(config)

下面是另一种使用stdin的方法。这是json cgi接口所需的方法(即,让web服务器将请求传递给脚本):

Python:

 import json, sys
 request = json.load( sys.stdin )
...

要从Linux终端测试脚本,请执行以下操作:

echo '{ "key1": "value 1", "key2": "value 2" }' | python myscript.py

要从Windows终端测试脚本,请执行以下操作:

echo { "key1": "value 1", "key2": "value 2" } | python myscript.py

这里需要注意的重要一点是,在命令行中不能将python对象作为参数传入。您正在使用的当前shell将解析参数,并根据自己的参数解析规则将它们传入

也就是说,您不能传入python字典。然而,JSON之类的东西可以让您非常接近

JSON或JavaScript对象表示是一种获取Python对象并将其转换为类似字符串的表示的方法,适用于传递给多种语言。也就是说,您可以传入如下字符串:

python saver.py '{"names": ["J.J.", "April"], "years": [25, 29]}'

在python脚本中,执行以下操作:

import json
data=json.loads(argv[1])

这将返回一个表示要传入的数据的字典

同样,您可以使用python字典并将其转换为字符串:

import json
data={'names': ["J.J.", "April"], 'years': [25,29]}
data_str=json.dumps(data)

还有其他方法可以实现这一点,尽管JSON是相当通用的。需要注意的关键是,无论您如何操作,您都不会将字典传递到Python中,而是传递一组参数(都是字符串),您需要以某种方式将这些参数转换为所需的Python类型

@EvanZamir-注意(通常)在shell中,如果引号出现在带引号的字符串中,则需要对其进行转义。在我的示例中,我用单引号引用JSON数据,JSON字符串本身使用双引号,因此不需要引号

如果混合使用引号(使用双引号引用参数,内部使用双引号),则shell将要求对其进行转义,否则它遇到的第一个双引号将被视为参数的“结束引号”。注意,在这个示例中,我使用单引号将JSON字符串括起来,并在字符串中使用双引号。如果在字符串中使用单引号,则需要使用反斜杠对其进行转义,即:

python saver.py '{"names": ["J.J.", "April\'s"], "years": [25, 29]}'

python saver.py "{\"names\": [\"J.J.\", \"April's\"], \"years\": [25, 29]}"

注意,引号是shell的一个函数,因此YMMV可能会有所不同(例如,如果使用某个exec方法调用脚本,则可能不需要转义,因为bash shell可能不会被调用)

相关问题 更多 >