我想加载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()
侵入我的应用程序(当然还有更多的可能性可以做)。我已经研究了djangoload
标记的实现,但它也只使用了__import_()
。在
有没有一种方法可以从安全、自包含的文件(甚至内存)加载Python代码(源代码或二进制代码)(不添加与sys.modules
的交互)?在最好的情况下,它不仅允许我从内存加载文件,还可以加载一个完整的包,比如__import__()
函数。在
使用CPython解释器,我不相信这是可能的。但是,PyPy提供了一个沙盒环境,使您想做的事情变得非常容易。在
Look at the PyPy documentation on sandboxing for details.
相关问题 更多 >
编程相关推荐