【问题标题】:How to run "exec" from the global scope in python如何在 python 的全局范围内运行“exec”
【发布时间】:2013-08-20 15:00:55
【问题描述】:

我有一个班级。在那个类中,我有一个功能。 在函数中,我有一个字符串变量,其中包含几个 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,因为通常有更好的方法来设计代码,而且它还引入了潜在的非常容易的代码注入。你想用字符串函数名做什么?为什么将它们作为字符串而不只是对象?
  • @Zimm3r:我想给内部客户一个选项来编写一些我想在我的代码中使用的 python 代码覆盖。
  • 这听起来不太好,让他们注入任意代码会带来安全风险。还有更好的方法,然后使用 exec 甚至注入字符串源代码。 (更新了一种方法)

标签: python


【解决方案1】:

在 python 中,覆盖可以随时对任何东西进行猴子修补,但如果您只是评估全局命名空间中的一些代码,inadvertent 符号冲突的风险。相反,我建议客户提供一个模块,如果在那里定义了函数,您的代码将调用其中的函数(否则默认实现)。

也就是说,documentation 建议:

exec(functions_to_create, globals())

【讨论】:

    【解决方案2】:

    首先有几件事。你创建一个函数来创建其他函数的原因是什么?你想做什么?可能有更好的方法。这里还有另一种所谓的创建函数的方法,它不涉及使用 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 的情况下注入源代码(这根本不是一个好主意

    您是否让客户提交了他们的代码,然后只进行自定义导入

    1. 客户提交代码
    2. 将该代码另存为 custom.py
    3. 在您想让客户注入的代码中,执行如下操作

      导入操作系统 如果 os.path.exists("custom.py"): 进口定制 custom.inject()

    这样他们就可以给你他们调用的代码注入,他们可以改变事情。

    【讨论】:

      猜你喜欢
      • 2018-04-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-13
      • 2010-10-21
      • 2018-10-29
      • 1970-01-01
      • 2011-09-26
      • 1970-01-01
      相关资源
      最近更新 更多