繁体   English   中英

来自命令行 arg 的 Python object 的文字评估

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM