Python - 如何避免exec进行批处理?

时间:2011-09-23 19:50:37

标签: python exec

我有一个现有的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)

1 个答案:

答案 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

除了TrueFalseNonetruefalse等一些关键字之外,生成的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'
        }
    ]
}