gpt4 book ai didi

python - 加载 Python 源代码/二进制文件而不添加到 sys.modules

转载 作者:太空宇宙 更新时间:2023-11-03 19:03:23 25 4
gpt4 key购买 nike

我想加载 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() 侵入我的应用程序(而且肯定还有更多的可能性可以做)。我查看了 django load 的实现标签,但只使用 __import_()也是如此。

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

最佳答案

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

Look at the PyPy documentation on sandboxing for details.

关于python - 加载 Python 源代码/二进制文件而不添加到 sys.modules,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15476971/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com