[英]Literal eval of Python object from command-line arg
我有一个稍微凌乱的管道,其中 Python 脚本从用户那里获取一些参数,在内部存储为字典:
{'robot': 'A', 'hours': 24, 'stations': [15, 17, 21], 'log': False}
并将其字符串表示附加到要在容器中运行的命令
python robot.py {'robot': 'A', 'hours': 24, 'stations': [15, 17, 21], 'log': False}
在robot.py
(容器内)中,我想像这样解析它:
import sys
from ast import literal_eval
if __name__ == '__main__':
params = literal_eval(sys.argv[1])
do_stuff(params)
目前由于解析错误而失败,因为 Python 试图以某种方式拆分输入。
两个问题:
literal_eval
? 我希望得到列表、布尔值、字符串、整数等作为参数。首先,您需要引用参数,因为 shell 将在python
甚至运行之前进行各种处理(其中大部分可能只会产生语法错误):
python robot.py "{'robot': 'A', 'hours': 24, 'stations': [15, 17, 21], 'log': False}"
其次,仅仅因为脚本是用Python 编写的,并不意味着输入必须是有效的 Python 代码。 对于这些应用程序,请使用 language-agnostic 格式,例如 JSON。
python robot.py '{"robot": "A", "hours": 24, "stations": [15, 17, 21], "log": False}'
您的代码使用json
模块而不是ast
模块。
import sys
import json
if __name__ == '__main__':
params = json.loads(sys.argv[1])
do_stuff(params)
目前由于解析错误而失败,因为 Python 试图以某种方式拆分输入。
不; 在 Python 收到它之前,输入由您的 shell 拆分。
这是一个可怕的想法吗?
大概; 您可能会想出一个方案,让用户在命令行上指定任意数据,解决标准 shell 解析并遵循 arguments 的标准约定,但这听起来像是很多工作 - 对您和用户来说都是如此。 如另一个答案所示,也可以在命令行上引用数据并将其作为单个令牌传递 - 但这很快就会变得笨拙。
(如果是这样,我应该怎么做?)
您可以让用户在命令行上提供首选项文件的名称,然后打开、读取和解析它。 我建议您使用 JSON 格式(具有标准库json
模块的内置支持)而不是期望 Python 文字。
或者,如果只有如图所示的几个选项,您可以遵循标准的命令行约定。 您的输入行可能类似于robot.py A --hours=24 --stations=15:17:21 --log
(不应该进行记录时省略log
)。 标准库argparse
模块可以帮助解析这类事情,尽管您必须自己理解stations
字符串。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.