如何在python中从全局范围运行“exec”

如何在python中从全局范围运行“exec”,python,Python,我有课。在那个类中,我有一个函数。 在函数中,我有一个字符串变量,它保存了几个python函数的定义 我希望从函数中创建在变量中定义的函数,以便在全局范围中创建它们 在此操作之后,我希望能够从全局范围调用新函数 例如: class MyClass: def create_functions(): functions_to_create = """ def glob1(): return "G1" def glob2(): return "G2" """ # ----&g

我有课。在那个类中,我有一个函数。 在函数中,我有一个字符串变量,它保存了几个python函数的定义

我希望从函数中创建在变量中定义的函数,以便在全局范围中创建它们

在此操作之后,我希望能够从全局范围调用新函数

例如:

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甚至注入字符串源代码更好的方法。更新了一种方法来做到这一点