2

我想加载 Python 代码(如果可能的话,使用任意文件扩展名,甚至从内存、源代码或二进制文件)而不将其添加到sys.modules. 使用imp.load_source工程加载文件,但返回的模块被添加到现有模块中sys.modules,甚至可能与现有模块连接(参见这个问题)!

所以,我目前正在做的是使用__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. 我无法加载任意文件,甚至无法从内存中加载。

exec出于安全原因,我试图避免该声明。评估的源可以使用(并且肯定有更多的可能性)exec侵入我的应用程序。sys._getframe()我已经查看了 djangoload标签的实现,但它也只是使用__import_()

有没有办法从一个安全、独立的文件(甚至内存)加载 Python 代码(源代码或二进制代码sys.modules)?在最好的情况下,它不仅可以让我从内存中加载文件,还可以加载像__import__()函数一样的完整包。

4

1 回答 1

1

使用 CPython 解释器,我不相信这是可能的。但是,PyPy 提供了一个沙盒环境,可以让您轻松完成任务。

有关详细信息,请查看有关沙盒的 PyPy 文档。

于 2013-03-18T13:31:28.003 回答