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

标签 python python-import python-importlib bytesio

上下文:

我目前有一个程序,它使用另一个 SO thread 中显示的方法从它们的文件路径(在映射的网络驱动器中)加载一组插件。 .这些插件被设计为滚动发布,这意味着我需要不断地访问来编写它们。当前机制锁定文件,所以我必须要求所有人关闭软件,以便我可以更新文件。

问题:

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

更一般地说:

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

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

注:

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

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

最佳答案

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

下面的代码是在我修改了加载器,去掉了公共(public)前缀之后,通过先执行源码创建了一个模块的类,得到globals从中,最后使用 Python 的 type创建模块类的方法。

它不是特别漂亮,而且肯定违反了一些 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()

关于Python 从字节 IO 导入(或更一般地从内存中的对象),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61175428/

相关文章:

python - anaconda 中的 Numba 模块为空

python - 打包python资源(Manifest.in vs package_data vs data_files)

Python:如何从模块中动态导入所有方法和属性

python - 在 Django 中,如何确保我的表单在提交后保留其初始值,但由于错误而返回到模板?

python - 如何使用 Python 2.7.8 |Anaconda 2.1.0(32 位)加载 png 图像?

python - Python 中的包导入

python - 将模块从一个 python 安装导入到另一个

python - 导入错误:无法从 'metadata' 导入名称 'importlib'

python NDB : what's the best way to have a Set instead of a List in property?

python - 在 python 中随时间监控子进程资源