为什么RestrictedPython在与Python 3.6一起使用时表现不同?

时间:2017-08-29 10:57:08

标签: python python-2.7 python-3.x

我正在尝试将RestrictedPython(请参阅documentation)与Python 3.6一起使用。 以下代码会在Python 2.73.6中生成不同的结果:

from RestrictedPython import compile_restricted
from RestrictedPython.Guards import safe_builtins
restricted_globals = dict(__builtins__ = safe_builtins)

src = '''
open('/etc/passwd')
'''

code = compile_restricted(src, '<string>', 'exec')
exec(code) in restricted_globals

Python 2.7中,结果符合预期:

Traceback (most recent call last):
  File "...Playground.py", line 10, in <module>
    exec(code) in restricted_globals
  File "<string>", line 2, in <module>
NameError: name 'open' is not defined

但是在Python 3.6中,结果是:

Traceback (most recent call last):
  File "...Playground.py", line 10, in <module>
    exec(code) in restricted_globals
  File "<string>", line 2, in <module>
FileNotFoundError: [Errno 2] No such file or directory: '/etc/passwd'

现在明显知道open名称/方法,但情况并非如此。为什么此代码在3.6中使用时的行为与在2.7中使用时的行为不同?

1 个答案:

答案 0 :(得分:2)

您应该为版本3.6编写代码的方式如下所示:

https://github.com/zopefoundation/RestrictedPython

问题代码示例&#34;。

即,以下代码将起作用,即open将未定义:

from RestrictedPython import compile_restricted
from RestrictedPython import safe_builtins

source_code = """
open('/etc/passwd')
"""
byte_code = compile_restricted(source_code, '<inline>', 'exec')
exec(byte_code, {'__builtins__': safe_builtins}, {})

至于发生这种情况的原因,我没有一个,但我想提出一种让它无论如何工作的方法。