加载Python源/二进制文件而不添加到sys.modules

时间:2013-03-18 12:34:13

标签: python dynamic import module

我想加载Python代码(如果可能的话,使用任意文件扩展名,甚至是内存,源代码或二进制文件),而不将其添加到sys.modules。使用imp.load_source可用于加载文件,但返回的模块已添加到sys.modules,甚至可能与现有模块一起使用(请参阅this question)!

所以,我目前正在使用__import__()内置功能。虽然它允许我从包中导入,但我无法加载任意文件。

try:
    m = __import__(name)
    for n in name.split('.')[1:]:
        m = getattr(m, n)
    return m
except:
    raise
finally:
    # Restore the old module configuration. Only modules that have
    # not been in sys.path before will be removed.
    for k, v in sys.modules.items():
        if k not in prev_modules and self.is_local(v) or not v:
            del sys.modules[k]
        else:
            sys.modules[k] = v
  1. 删除导入之前尚未进入的所有模块对我来说是一种非常黑客的方式。
  2. 当名称已存在的模块时,不会重新加载。
  3. 我无法加载任意文件,甚至无法加载内存。
  4. 由于安全原因,我试图避免使用exec语句。由exec评估的来源可以使用sys._getframe()入侵我的应用程序(并且确实有更多可能性)。我查看了django load标记的实现,但也只使用了__import_()

    有没有办法从安全,自包含的文件(甚至内存)中加载Python代码(源代码或二进制代码)(不添加与sys.modules的交互)?在最好的情况下,它不仅允许我从内存加载文件,还可以加载像__import__()函数这样的完整包。

1 个答案:

答案 0 :(得分:1)

使用CPython解释器,我不相信这是可能的。但是,PyPy提供了一个沙盒环境,可以让你想做的事情变得非常简单。

Look at the PyPy documentation on sandboxing for details.