我知道可以通过以下方式访问内置函数:
object().__reduce__()[0].__globals__["__builtins__"]
这似乎适用于大多数功能。但是,我似乎无法找到exec()
。我很确定它是一个内置函数,为什么它不会出现在__builtins__
中呢? eval()
和execfile()
都在那里。
我正在使用python 2.7
更简单的方法是使用内置函数globals()
:)所以上面的内容可以简化为:
globals()['__builtins__'].__dict__
答案 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中,exec
为converted 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())