我正在构建一个类似Mathwork的Simulink或Tanner-Spice的系统,用户使用可用的运算符定义一个函数。然后我需要运行该函数并将响应返回给用户。我正在使用Javascript进行UI交互。在内部,用户定义的函数(UDF)被捕获为JSON并传递给解析此JSON的Python服务器。
我的问题是,我现在如何运行这个UDF?我并不担心恶意用户利用这种攻击能力,因为我的所有用户都是受信任的用户。
我想到的一种方法是将UDF作为python脚本写入磁盘,然后运行commands.getstatusoutput()。这里的问题是该函数可能需要多个输入,并且无法通过这些输入。
我正在寻找的是能够动态加载新的python文件及其功能,并能够调用它们。
找到一篇博客文章,解释如何执行此操作。我想问题是我没有使用正确的关键字进行搜索。
无论如何,David Janes的博客here解释了如何动态加载python脚本。
我仍然会邀请你们发表评论并提出是否有更好的方法来做我想做的事。
谢谢, NIK
答案 0 :(得分: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!
答案 1 :(得分: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
时,您可能无法在函数之外使用return
或yield
语句。
示例:
your_json_data="def example(arg1,arg2): print arg1,arg2"
exec(your_json_data)
example("Hello","World")
##Output: "Hello World"
答案 2 :(得分:0)
导入具有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
如果您没有完全控制输入,那么您应该在受限制的环境中执行上述代码,例如,您可以将字符串发送到a sandboxed pypy interpreter。
有ast
module可以帮助您以安全的方式解析和操作代码,例如:Evaluating a mathematical expression in a string。