我想加载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
由于安全原因,我试图避免使用exec
语句。由exec
评估的来源可以使用sys._getframe()
入侵我的应用程序(并且确实有更多可能性)。我查看了django load
标记的实现,但也只使用了__import_()
。
有没有办法从安全,自包含的文件(甚至内存)中加载Python代码(源代码或二进制代码)(不添加与sys.modules
的交互)?在最好的情况下,它不仅允许我从内存加载文件,还可以加载像__import__()
函数这样的完整包。
答案 0 :(得分:1)
使用CPython解释器,我不相信这是可能的。但是,PyPy提供了一个沙盒环境,可以让你想做的事情变得非常简单。