python exec在哪里?

时间:2014-06-10 23:42:35

标签: python python-2.7 eval

我知道可以通过以下方式访问内置函数:

object().__reduce__()[0].__globals__["__builtins__"]

这似乎适用于大多数功能。但是,我似乎无法找到exec()。我很确定它是一个内置函数,为什么它不会出现在__builtins__中呢? eval()execfile()都在那里。

我正在使用python 2.7

[编辑]

更简单的方法是使用内置函数globals() :)所以上面的内容可以简化为: globals()['__builtins__'].__dict__

2 个答案:

答案 0 :(得分:3)

在Python 2.x中,exec is a statement,而不是函数:

>>> # Python 2.x interpreter
>>> 'exec' in dir(__builtins__)
False
>>> callable(exec)  # This would return True if exec was a function
  File "<stdin>", line 1
    callable(exec)
                ^
SyntaxError: invalid syntax
>>>

在Python 3.x中,execconverted into a function

>>> # Python 3.x interpreter
>>> 'exec' in dir(__builtins__)
True
>>> callable(exec)
True
>>>

答案 1 :(得分:2)

exec关键字,例如print。因此它不是一个函数。

如果您尝试分配,可以看到这个:

>>> print = 3
  File "<stdin>", line 1
    print = 3
          ^
SyntaxError: invalid syntax
>>> exec = 3
  File "<stdin>", line 1
    exec = 3
         ^
SyntaxError: invalid syntax
>>> eval = 3
>>> 

如果您在不使用exec字样的情况下致电exec,则可以执行以下操作:

import ctypes

ctypes.pythonapi.PyRun_SimpleString("print 'hello world'")

滥用CPython API来执行一段代码(可以任意长)。

如果您需要控制全局变量和本地变量,请使用PyRun_String

Py_file_input = 257 # Include/Python.h
def my_exec(s, _globals, _locals):
    return ctypes.pythonapi.PyRun_String(s, Py_file_input, ctypes.py_object(_globals), ctypes.py_object(_locals))

my_exec("print 3 + 3", globals(), locals())