栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何在运行时制作python模块的副本?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何在运行时制作python模块的副本?

您总是可以做一些技巧,例如导入模块,然后将其从sys.modules中删除或尝试复制模块。但是,Python已经在其标准库中提供了所需的内容。

import imp # Standard module to do such things you want to.# We can import any module including standard ones:os1=imp.load_module('os1', *imp.find_module('os'))# Here is another one:os2=imp.load_module('os2', *imp.find_module('os'))# This returns True:id(os1)!=id(os2)

Python3.3以上

imp.load_module
被弃用python3.3
+
,并建议使用
importlib

#!/usr/bin/env python3import sysimport importlib.utilSPEC_OS = importlib.util.find_spec('os')os1 = importlib.util.module_from_spec(SPEC_OS)SPEC_OS.loader.exec_module(os1)sys.modules['os1'] = os1os2 = importlib.util.module_from_spec(SPEC_OS)SPEC_OS.loader.exec_module(os2)sys.modules['os2'] = os2del SPEC_OSassert os1 is not os2,     "Module `os` instancing failed"

在这里,我们两次导入相同的模块,但作为完全不同的模块对象。如果检查sys.modules,则可以看到您输入的两个名称作为load_module调用的第一个参数。请查看文档以了解详细信息。

更新:

为了使这种方法的主要区别显而易见,我想更清楚一点:当您以这种方式导入同一模块时,对于在运行时导入的每个其他模块,您都可以全局访问这两个版本,这正是发问者所需要的我明白了

下面是另一个强调这一点的示例。

这两个语句做的完全相同:

import my_socket_module as socket_importedsocket_imported = imp.load_module('my_socket_module',    *imp.find_module('my_socket_module'))

在第二行,我们重复两次’my_socket_module’字符串,这就是import语句的工作方式;但是实际上使用这两个字符串有两个不同的原因。

我们将其传递给find_module时的第二次出现用作将在系统上找到的文件名。当我们将字符串传递给load_module方法时,该字符串的首次出现被用作
已加载模块的系统范围的标识符

因此,我们可以为它们使用不同的名称,这意味着我们可以使其完全像复制模块的python源文件并加载它一样工作。

socket = imp.load_module('socket_original', *imp.find_module('my_socket_module'))socket_monkey = imp.load_module('socket_patched',*imp.find_module('my_socket_module'))def alternative_implementation(blah, blah):    return 'Happiness'socket_monkey.original_function = alternative_implementationimport my_sub_module

然后在my_sub_module中,我可以导入系统上不存在的’socket_patched’!这里我们在my_sub_module.py中。

import socket_patchedsocket_patched.original_function('foo', 'bar')# This call brings us 'Happiness'


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/624295.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号