如何在python中从全局范围运行“exec”
我有课。在那个类中,我有一个函数。 在函数中,我有一个字符串变量,它保存了几个python函数的定义 我希望从函数中创建在变量中定义的函数,以便在全局范围中创建它们 在此操作之后,我希望能够从全局范围调用新函数 例如:如何在python中从全局范围运行“exec”,python,Python,我有课。在那个类中,我有一个函数。 在函数中,我有一个字符串变量,它保存了几个python函数的定义 我希望从函数中创建在变量中定义的函数,以便在全局范围中创建它们 在此操作之后,我希望能够从全局范围调用新函数 例如: class MyClass: def create_functions(): functions_to_create = """ def glob1(): return "G1" def glob2(): return "G2" """ # ----&g
class MyClass:
def create_functions():
functions_to_create = """
def glob1():
return "G1"
def glob2():
return "G2"
"""
# ----> HERE IS THE MISSING PART, LIKE RUNNING exec in the global scope <----
# The following function should work:
def other_function_in_global_scope():
print "glob1: %s, glob2: %s" % (glob1(), glob2())
缺少的部分应该是什么
提前感谢 首先要做几件事。创建函数以创建其他函数的原因是什么?你想干什么?也许有更好的办法。另外,这里还有另一种所谓的创建函数的方法,它不涉及使用exec
>>> def create_functions():
... global glob1
... def glob1():
... return "G1"
...
>>> glob1()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'glob1' is not defined
>>> create_functions()
>>> glob1()
'G1'
>>>
编辑
在没有exec的情况下注入源代码这根本不是一个好主意
你有客户提交他们的代码,然后只做一个自定义导入
客户提交代码
将该代码另存为say custom.py
在您希望让客户注入的代码中,执行以下操作
导入操作系统
如果os.path.existscustom.py:
进口关税
自定义注入
这样他们就可以给你他们的代码,你称之为inject,他们可以改变一些事情。首先要做几件事。创建函数以创建其他函数的原因是什么?你想干什么?也许有更好的办法。另外,这里还有另一种所谓的创建函数的方法,它不涉及使用exec
>>> def create_functions():
... global glob1
... def glob1():
... return "G1"
...
>>> glob1()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'glob1' is not defined
>>> create_functions()
>>> glob1()
'G1'
>>>
编辑
在没有exec的情况下注入源代码这根本不是一个好主意
你有客户提交他们的代码,然后只做一个自定义导入
客户提交代码
将该代码另存为say custom.py
在您希望让客户注入的代码中,执行以下操作
导入操作系统
如果os.path.existscustom.py:
进口关税
自定义注入
通过这种方式,他们可以给你他们调用的代码注入,他们可以改变事情。在python中,重写可以随时修补任何东西,但是如果你只是在全局名称空间中计算一点代码,就有无意中发生符号冲突的风险。我建议客户提供一个模块,如果在其中定义了函数,那么您的代码将调用其中的函数,而默认实现则不然 这表明:
exec(functions_to_create, globals())
在python中,重写可以随时修补任何东西,但如果您只是在全局名称空间中计算一点代码,则会有无意中发生符号冲突的风险。我建议客户提供一个模块,如果在其中定义了函数,那么您的代码将调用其中的函数,而默认实现则不然 这表明:
exec(functions_to_create, globals())
很少推荐运行exec,因为通常有更好的方法来设计代码,而且它还引入了可能非常简单的代码注入。你想用字符串函数名做什么?为什么要将它们作为字符串而不仅仅是对象?@Zimm3r:我想给一个内部客户一个选项,让他们编写一些我想在代码中使用的python代码重写。这听起来不太好,让他们注入任意代码会带来安全风险。还有比使用exec甚至注入字符串源代码更好的方法。很少推荐使用一种方法来更新itRunning exec,因为通常有更好的方法来设计代码,而且它还引入了可能非常简单的代码注入。你想用字符串函数名做什么?为什么要将它们作为字符串而不仅仅是对象?@Zimm3r:我想给一个内部客户一个选项,让他们编写一些我想在代码中使用的python代码重写。这听起来不太好,让他们注入任意代码会带来安全风险。还有比使用exec甚至注入字符串源代码更好的方法。更新了一种方法来做到这一点