为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

aluckdog 2022-10-06 19:26:05
语境:我目前有一个程序,它使用另一个SO 线程中显示的方法从它们的文件路径(在映射的网络驱动器中)加载一组插件。这些插件被设计为滚动发布,这意味着我需要不断地访问来编写它们。当前机制锁定文件,所以我必须要求所有人关闭软件,以便我可以更新文件。问题:我想知道是否有一种方法,可能使用与上面链接的方法类似的方法,从io.BytesIO插件原始内容的对象中导入文件(因此解锁文件让我随意进行更改)。更普遍:更具体地说,我可以在不接触物理磁盘的情况下将原始模块内容保存在内存中吗?如果这样的事情是不可能的,有没有办法将这些模块完全加载到内存中,这样我就可以解锁正在导入的文件?正如我在评论中所说,我知道您可以在基于 Linux 的操作系统上安装虚拟文件系统(这可能解决了我的问题),但遗憾的是,我为 Windows 和 Microsoft 开发永远无法让您的生活变得轻松!:-)笔记:我不是在问我可以在哪里复制这些文件以从本地版本(例如临时、缓存等)导入它们。我知道这是一个非常专业的问题,因此非常感谢任何帮助
查看完整描述

1 回答

?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

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

以下代码是在我修改加载器以删除公共前缀后,并通过首先执行源代码,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()


查看完整回答
反对 回复 2022-10-06
  • 1 回答
  • 0 关注
  • 198 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号