当前位置: 首页 > 面试题库 >

如何覆盖Python导入?

翁翰墨
2023-03-14
问题内容

我正在研究pypreprocessor,它是一种采用c样式指令的预处理器,而且能够使它像传统的预处理器一样工作(它是自耗的,并且可以即时执行后处理的代码),但它会破坏库进口。

问题是:预处理程序运行文件,对其进行处理,将其输出到一个临时文件中,然后执行exec()临时文件。导入的库需要有所不同,因为它们没有执行,而是被加载并可以被调用者模块访问。

我需要做的是:中断导入(因为预处理程序正在导入的中间运行),将后处理的代码作为tempModule加载,并用tempModule替换原始的导入以欺骗调用脚本相信tempModule是原始模块。

到目前为止,我到处搜索并且没有解决方案。

到目前为止,这个堆栈溢出问题是我迄今为止最接近提供答案的问题:
在Python中覆盖名称空间

这就是我所拥有的。

# Remove the bytecode file created by the first import
os.remove(moduleName + '.pyc')

# Remove the first import
del sys.modules[moduleName]

# Import the postprocessed module
tmpModule = __import__(tmpModuleName)

# Set first module's reference to point to the preprocessed module
sys.modules[moduleName] = tmpModule

moduleName是原始模块的名称,tmpModuleName是后处理的代码文件的名称。

奇怪的是,该解决方案仍然完全正常运行,就好像第一个完成的模块正常加载一样;除非您删除最后一行,否则会出现模块未找到错误。

希望Stack Overflow上的某人比我更了解导入,因为这使我感到困惑。

注意:我只会授予解决方案,或者,如果在Python中无法实现,则只能授予解决方案。 关于为什么并非不可能的最佳,最详尽的解释。

更新:对于任何有兴趣的人,这里是有效的代码。

if imp.lock_held() is True:
    del sys.modules[moduleName]
    sys.modules[tmpModuleName] = __import__(tmpModuleName)
    sys.modules[moduleName] = __import__(tmpModuleName)

“ imp.lock_held”部分检测模块是否正在作为库加载。其余各行如下。


问题答案:

这回答了你的问题了吗?第二次导入可以解决问题。

Mod_1.py

def test_function():
    print "Test Function -- Mod 1"

Mod_2.py

def test_function():
    print "Test Function -- Mod 2"

测试文件

#!/usr/bin/python

import sys

import Mod_1

Mod_1.test_function()

del sys.modules['Mod_1']

sys.modules['Mod_1'] = __import__('Mod_2')

import Mod_1

Mod_1.test_function()


 类似资料:
  • 问题内容: 我正在尝试Backbone.js,而我正在尝试的事情之一就是调用远程API,因此,据我了解的文档资料,我需要能够覆盖Backbone.sync 。 在文档本身中没有如何执行此操作的示例,并且似乎没有用于Backbone的google组…有人可以指出执行此操作的示例吗? 问题答案: 看看这个带注释的源示例,在该示例中,它们被本地存储替代项覆盖 基本上,Backbone.sync应该是一个

  • 问题内容: 如何使dict的子类尽可能“完美” ?最终目标是要有一个简单的字典,其中的键是小写的。 看来应该有一些微小的原语可以重写以完成此工作,但是根据我的所有研究和尝试,似乎并非如此: 如果我覆盖,则get/ set不起作用。如何使它们工作?当然,我不需要单独实施它们吗? 我是否在阻止酸洗,我需要实施等吗? 我是否需要以及? 我应该只使用(似乎不应该使用)吗?如果是这样,怎么办?这些文档并不完

  • 我如何覆盖Spring引导的favicon? 否则,WebMvcAutoConfiguration注册faviconRequestHandler bean(请参见源https://github.com/spring-projects/spring-boot/blob/master/spring-boot-autocigure/src/main/java/org/springframework/bo

  • 我正在使用来衡量我的测试的代码覆盖率。我已经启用了分支机构覆盖,但我不能完全理解该报告。 没有分支保险,我得到100%的保险: 启用分支覆盖: 有问题的来源可以在这里找到。 <代码>21- 然而,<代码>53-

  • 问题内容: 因此,我有一个自定义类,该类具有与int一起使用的功能。然而,在我的程序(库),它越来越被称为周围的其他方法,即,在那里是我的班。有什么办法可以让它使用我的功能吗? 问题答案: 只需将以下内容添加到类定义中,就可以了:

  • 问题内容: 我创建了一个自定义样式表,该样式表将覆盖Wordpress模板的原始CSS。但是,在我的日历页面上,原始CSS具有声明的每个表格单元格的高度: 有什么办法可以覆盖这个吗? 问题答案: 覆盖!important修饰符 只需使用添加另一个CSS规则,并赋予选择器更高的特异性(向选择器添加其他标签,id或类) 在比现有选择器晚的位置添加具有相同选择器的CSS规则(平局中,最后一个定义的获胜者