簡體   English   中英

覆蓋Python導入而不會導致受限的執行模式

[英]Overriding Python import without causing restricted execution mode

我需要在lambda函數(compile())中覆蓋默認的導入器,以便可以使用某些模塊的替代版本。 但是,lambda代碼不必以“受限執行”(RE)運行,因為只有授權人員才能生成正在編譯的代碼。 我們還要求能夠打開文件,這在RE中是禁止的:

IOError: file() constructor not accessible in restricted mode

但是,為了覆蓋導入程序,我需要復制__builtin __模塊並將新的導入程序分配給__import __。 但是,使用__builtin __的替代版本是引起RE的具體原因。

如何簡單地覆蓋導入程序而不會引起RE副作用?

編輯:對於那些沒有經歷過並且沒有想象力的人:

def copy_module(m):
    x = type(m)(m.__name__, m.__doc__)
    x.__dict__.update(m.__dict__)
    return x

# Make sure we get the module in all situations (depending on where 
# __builtins__ is invoked, it may be a dictionary).
builtins = __import__('__builtin__')

custom_builtins = copy_module(builtins)
custom_builtins.__import__ = __import__

l = """\
with open('/dev/null') as f:
    pass
"""

c = compile(l, 'open_test', 'exec')

globals_ = {
    '__builtins__': custom_builtins, 
    '__name__': '__handler__', 
    '__doc__': None, 
    '__package__': None,
}

locals_ = {}

exec c in globals_, locals_

結果:

Traceback (most recent call last):
  File "import_replace_2.py", line 31, in <module>
    exec c in globals_, locals_
  File "open_test", line 1, in <module>
IOError: file() constructor not accessible in restricted mode

我沒有收到RE錯誤。 從python文檔中:

__import__ :此函數由import語句調用。 可以替換它(通過導入__builtin__模塊並分配給__builtin __.__ import__)以更改import語句的語義

以下內容對我有用(它所做的一切與標准導入相同,但將垃圾郵件替換為數學)。

>>> import builtins
>>> _import_alias = __import__
>>> builtins.__import__ = lambda module, *args, **kwargs: _import_alias(module.replace("spam", "math"), *args, **kwargs)
>>> import spam as math
>>> math.factorial(10)

重要的是,創建__import__的別名,並覆蓋builtins.__import__ ,而不是標准的__import__

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM