加载Python源代码/二进制文件而不添加到系统模块

2024-05-23 18:07:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我想加载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. 我不能加载任意文件,甚至不能从内存中加载。在

出于安全原因,我试图避免exec语句。由exec评估的源代码可以使用sys._getframe()侵入我的应用程序(当然还有更多的可能性可以做)。我已经研究了djangoload标记的实现,但它也只使用了__import_()。在

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


Tags: 模块文件方法内存代码nameinimport