在不添加sys.modules的情况下加载Python源代码/二进制文件
我想加载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:]:
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()
侵入我的应用程序(当然还有更多的可能性)。我已经研究了djangoload
标记的实现,但它也只使用了\uu导入()
有没有一种方法可以从一个安全、自包含的文件(甚至内存)加载Python代码(源代码或二进制代码)(无需添加与sys.modules
)的交互)?在最好的情况下,它不仅允许我加载一个文件和内存,还允许我加载一个完整的包,比如\uuu import\uu()
函数。使用CPython解释器,我认为这是不可能的。然而,PyPy提供了一个沙盒环境,使您想做的事情变得非常容易
使用CPython解释器,我认为这是不可能的。然而,PyPy提供了一个沙盒环境,使您想做的事情变得非常容易
我认为安全
和自足
这个词在这里是不可能的组合。AFAIK,导入python模块可以有效地执行它。我所知道的最接近的事情是,试图构建一个安全的exec。它是基于静态分析代码和删除对“危险”内置的访问。我认为secure
和self-contained
这个词在这里是不可能的组合。AFAIK,导入python模块可以有效地执行它。我所知道的最接近的事情是,试图构建一个安全的exec。它基于对代码的静态分析和删除对“危险”内置代码的访问。