我有一个稍微混乱的管道,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试图以某种方式拆分输入,因此解析错误导致此操作失败
两个问题:
首先,您需要引用参数,因为shell将在
python
甚至运行之前执行所有方式的处理(其中大部分可能只会产生语法错误):其次,仅仅因为脚本是用Python编写的,并不意味着输入必须是有效的Python代码。对于这些应用程序,请使用与语言无关的格式,如JSON
您的代码使用
json
模块而不是ast
模块没有;在Python接收输入之前,输入被shell分割
可能;您可能会提出一个方案,允许用户在命令行上指定任意数据,围绕标准shell解析并遵循参数的标准约定,但这听起来需要做很多工作——对于您和用户来说。如另一个答案所示,在命令行上也可以引用数据并将其作为单个令牌传递,但这很快就会变得非常笨拙
您可以让用户在命令行上提供首选项文件的名称,然后打开、读取和解析该文件。我建议您使用JSON格式(带有标准库
json
模块的内置支持),而不是使用Python文本或者,如果只有如图所示的几个选项,则可以遵循标准命令行约定。您的输入行可能看起来像
robot.py A hours=24 stations=15:17:21 log
(在不应该进行日志记录时省略log
)。标准库argparse
模块可以帮助解析这类内容,尽管您必须自己理解stations
字符串相关问题 更多 >
编程相关推荐