Python 从字节 IO(或更一般地从内存中的对象)导入

Python import from byte IO (or more generally from an object in memory)

上下文:

我目前有一个程序使用另一个 SO thread 中显示的方法从它们的文件路径(在映射的网络驱动器中)加载一组插件。这些插件被设计为滚动发布,这意味着我需要不断访问才能编写它们。现在的机制锁了文件,所以我不得不请大家关闭软件,这样我才能更新文件。

问题:

我想知道是否有办法,可能使用与上面链接类似的方法,从插件原始内容的 io.BytesIO 对象导入文件(因此解锁文件让我制作随意更改)。

更一般地说:

更具体地说,我可以在不接触物理磁盘的情况下将原始模块内容保留在内存中吗?如果这样的事情不可能,有没有办法将这些模块完全加载到内存中,这样我就可以解锁正在导入的文件?

正如我在评论中所述,我知道您可以在基于 Linux 的 OS 上安装虚拟文件系统(这可能已经解决了我的问题),但遗憾的是我正在开发Windows Microsoft 永远无法让您的生活变得轻松! :-)

注:

我不是在问在哪里可以复制这些文件以从本地版本(例如临时文件、缓存等)导入它们。

我知道这是一个非常专业的问题,因此非常感谢您的帮助

虽然不是我最初要求的来自 io.BytesIO 对象,但在找到这个 incredibly helpful article 后,我能够从其源代码导入模块。我没有在这里复制代码,因为它非常大,尽管我能够让它成功导入虚拟模块。

下面的代码是在我修改加载程序以删除公共前缀之后,通过首先执行源代码创建模块的 class,从中获取 globals 最后使用 Python 的 type 方法创建模块 class.

它不是特别漂亮,而且肯定违反了一些 Python 风格建议,所以我绝对愿意改进!

source = """def hello():
    print("I don't want to say hi to the world")"""
name = "my_module"

glo = {}
exec(source, glo)

injector = DependencyInjector()
injector.provide(name, type(name, (), glo))
injector.install()

foo = __import__(name)
foo.hello()