1

我正在构建一个类似于 Mathwork 的 Simulink 或 Tanner-Spice 的系统,其中用户使用可用的运算符定义函数。然后我需要运行该函数并将响应返回给用户。我正在使用 Javascript 进行 UI 交互。在内部,用户定义函数 (UDF) 被捕获为 JSON 并传递到解析此 JSON 的 Python 服务器。

我的问题是,我现在如何运行这个 UDF?我不担心恶意用户利用这种能力进行黑客攻击,因为我所有的用户都是值得信赖的。

我认为的一种方法是将 UDF 作为 python 脚本写入磁盘,然后运行 ​​commands.getstatusoutput()。这里的问题是该函数可能需要多个输入,并且不可能传递这些输入。

我正在寻找的是能够动态加载新的 python 文件及其函数,并能够调用它们。


找到了一篇解释如何执行此操作的博客文章。我想问题是我没有使用正确的关键字进行搜索。

无论如何,David Janes 的博客在这里解释了如何动态加载 python 脚本。

如果有更好的方法来做我想做的事,我仍然会邀请你们发表评论并提出建议。

谢谢,尼克

4

3 回答 3

1

这是一个简单的类,它从代码字符串、文件或代码对象中创建类似模块的对象:

class DynamicModule(object):
    def __init__(self, code):
        exec code in self.__dict__

示例用法:

>>> mod = DynamicModule("""
... def foo(x, y):
...     print x**2 + y
... """)
>>> 
>>> mod.foo(10, 20)

带有文件的示例(假设/tmp/hello.py包含一个名为 的函数hello):

>>> mod2 = DynamicModule(open('/tmp/hello.py'))
>>> mod2.hello('World')
Hello, World!
于 2012-08-27T01:14:20.080 回答
0

您可以为此使用该exec模块,因为输入是可信的。

exec文档:http ://docs.python.org/reference/simple_stmts.html#exec

文档摘录:

This statement supports dynamic execution of Python code. The first expression should evaluate to either a string, an open file object, or a code object. If it is a string, the string is parsed as a suite of Python statements which is then executed (unless a syntax error occurs). [1] If it is an open file, the file is parsed until EOF and executed. If it is a code object, it is simply executed. In all cases, the code that’s executed is expected to be valid as file input (see section File input).

但是,您应该注意,在使用时exec您不能在函数之外使用returnoryield语句。

例子:

your_json_data="def example(arg1,arg2):    print arg1,arg2"
exec(your_json_data)
example("Hello","World")
##Output: "Hello World"
于 2012-08-26T19:48:02.863 回答
0

要导入具有固定名称的 Python 文件,该文件位于sys.path

import mod # it can import mod.py file

result = mod.some_function(*args)

如果模块名称在字符串中,则导入模块:

import importlib

m = importlib.import_module("mod")
result = m.some_function(*args)

如果您在字符串中包含模块的内容:

ns = {}
exec """

def some_function(a, b):
    return a + b

# other functions, classes or any code
""" in ns

result = ns['some_function'](1, 2)
print result # -> 3

如果您不完全控制输入,那么您应该在受限环境中执行上述代码,例如,您可以将字符串发送到沙盒 pypy 解释器

Python可以解析Python

有一个ast模块可以帮助您以安全的方式解析和操作代码,例如:Evaluating a math expression in a string

于 2012-08-27T02:35:02.693 回答