Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在不添加sys.modules的情况下加载Python源代码/二进制文件_Python_Dynamic_Import_Module - Fatal编程技术网

在不添加sys.modules的情况下加载Python源代码/二进制文件

在不添加sys.modules的情况下加载Python源代码/二进制文件,python,dynamic,import,module,Python,Dynamic,Import,Module,我想加载Python代码(如果可能的话,可以使用任意文件扩展名,甚至可以从内存、源代码或二进制代码加载),而不将其添加到sys.modules。使用imp.load\u source可以加载文件,但返回的模块会添加到sys.modules,甚至可能与现有模块连接(请参阅) 因此,我目前正在使用的是内置的\uuuuuu导入()。虽然它允许我从包中导入,但我不能加载任意文件 try: m = __import__(name) for n in name.split('.')[1:]:

我想加载Python代码(如果可能的话,可以使用任意文件扩展名,甚至可以从内存、源代码或二进制代码加载),而不将其添加到
sys.modules
。使用
imp.load\u source
可以加载文件,但返回的模块会添加到
sys.modules
,甚至可能与现有模块连接(请参阅)

因此,我目前正在使用的是内置的
\uuuuuu导入()。虽然它允许我从包中导入,但我不能加载任意文件

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
  • 对我来说,删除导入之前没有使用过的所有模块是一种非常棘手的方法
  • 当名称为的模块已存在时,不会重新加载该模块
  • 我无法加载任意文件,甚至无法从内存加载
  • 由于安全原因,我试图避免使用
    exec
    语句。
    exec
    评估的源代码可以使用
    sys.\u getframe()
    侵入我的应用程序(当然还有更多的可能性)。我已经研究了django
    load
    标记的实现,但它也只使用了
    \uu导入()


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

    使用CPython解释器,我认为这是不可能的。然而,PyPy提供了一个沙盒环境,使您想做的事情变得非常容易


    使用CPython解释器,我认为这是不可能的。然而,PyPy提供了一个沙盒环境,使您想做的事情变得非常容易


    我认为
    安全
    自足
    这个词在这里是不可能的组合。AFAIK,导入python模块可以有效地执行它。我所知道的最接近的事情是,试图构建一个安全的exec。它是基于静态分析代码和删除对“危险”内置的访问。我认为
    secure
    self-contained
    这个词在这里是不可能的组合。AFAIK,导入python模块可以有效地执行它。我所知道的最接近的事情是,试图构建一个安全的exec。它基于对代码的静态分析和删除对“危险”内置代码的访问。