从命令行参数计算Python对象的文字值

2024-06-13 05:05:03 发布

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

我有一个稍微混乱的管道,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试图以某种方式拆分输入,因此解析错误导致此操作失败

两个问题:

  • 这是一个可怕的想法吗?(如果是,我应该怎么做?)
  • 如果不是,我如何将dict作为一个参数?我希望将列表、布尔值、字符串、整数等作为参数

Tags: 字符串pyimportlogfalse参数管道eval
2条回答

首先,您需要引用参数,因为shell将在python甚至运行之前执行所有方式的处理(其中大部分可能只会产生语法错误):

python robot.py "{'robot': 'A', 'hours': 24, 'stations': [15, 17, 21], 'log': False}"

其次,仅仅因为脚本是用Python编写的,并不意味着输入必须是有效的Python代码。对于这些应用程序,请使用与语言无关的格式,如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)

Currently this fails because of parsing errors, as Python attempts to split up the input in some way.

没有;在Python接收输入之前,输入被shell分割

is this a horrible idea?

可能;您可能会提出一个方案,允许用户在命令行上指定任意数据,围绕标准shell解析并遵循参数的标准约定,但这听起来需要做很多工作——对于您和用户来说。如另一个答案所示,在命令行上也可以引用数据并将其作为单个令牌传递,但这很快就会变得非常笨拙

(If so, what should I do instead?)

您可以让用户在命令行上提供首选项文件的名称,然后打开、读取和解析该文件。我建议您使用JSON格式(带有标准库json模块的内置支持),而不是使用Python文本

或者,如果只有如图所示的几个选项,则可以遵循标准命令行约定。您的输入行可能看起来像robot.py A hours=24 stations=15:17:21 log(在不应该进行日志记录时省略log)。标准库argparse模块可以帮助解析这类内容,尽管您必须自己理解stations字符串

相关问题 更多 >