我有一个现有的python应用程序(有限部署),需要能够运行批处理/宏(即foo做3次,更改x,做y)。目前我将这个实现为exec运行一个文本文件,其中包含简单的python代码来完成所有必需的批处理。
然而,exec是凌乱的(即安全问题),并且在某些情况下,它与您的文件中实际具有相同代码的行为完全不同。我怎样才能使用exec?我不想编写我自己的迷你宏语言,并且用户需要在每个会话中使用多个不同的宏,所以我无法设置它使得宏是一个调用软件然后自己运行的python文件类似。
有更干净/更好的方法吗?
伪代码:在软件中它有类似的东西: - 当一个宏被调用时
for line in macrofile:
exec line
并且macrofiles是python,例如:
property_of_software_obj = "some str"
software_function(some args)
等
答案 0 :(得分:0)
您是否考虑过使用像JSON这样的序列化数据格式?它很轻巧,可以轻松转换为Python词典,所有酷孩子都在使用它。
您可以以有意义的方式构建数据,但不需要包含实际代码。然后,您可以读取该构造,获取所需的部分,然后将其传递给函数或类。
编辑:在可能的JSON规范的简洁示例中添加了一个传递。
你的JSON:
{
"macros": [
{
"function": "foo_func",
"args": {
"x": "y",
"bar": null
},
"name": "foo",
"iterations": 3
},
{
"function": "bar_func",
"args": {
"x": "y",
"bar": null
},
"name": "bar",
"iterations": 1
}
]
}
然后用Python的json lib解析它:
import json
# Get JSON data from elsewhere and parse it
macros = json.loads(json_data)
# Do something with the macros
for macro in macros:
run_macro(macro) # For example
除了True
,False
,None
(true
,false
等一些关键字之外,生成的Python数据在语法上几乎与JSON完全相同,JSON中的null
。
{
'macros': [
{
'args':
{
'bar': None,
'x': 'y'
},
'function': 'foo_func',
'iterations': 3,
'name': 'foo'
},
{
'args':
{
'bar': None,
'x': 'y'
},
'function': 'bar_func',
'iterations': 1,
'name': 'bar'
}
]
}