当您执行 时import foo
,如果sys.modules['foo']
已经存在,解释器只会返回它而不是执行新的导入。
因此,要伪造 outmodule1
的import
声明,只需在 load 之前填写值module1
。这有点hacky,但非常简单。例如:
我的测试.py:
import sys
import unittest
import my_fake_module
sys.modules['module_i_want_to_fake'] = my_fake_module
import module1
//test code here
module1.some_method()
//test code here
模块1.py:
import module_i_want_to_fake
print(module_i_want_to_fake)
这将打印出如下内容:
<module 'my_fake_module' from 'my_fake_module.pyc'>
如果您需要module1
更彻底地伪造(即使它试图自省模块),您可以创建一个新模块(通过types.ModuleType
),其中的代码来自my_fake_module
name 'module_i_want_to_fake'
,以及您想要的任何其他更改。
如果您需要比仅通过预先静态重命名模块更动态地执行此操作,您可以构建一个导入挂钩,如PEP 302中所述。这需要您重新实现大量的导入机制,这在 2.x 中是一个巨大的痛苦,但importlib
在 3.1+ 中使它变得容易得多。
幸运的是,通常情况下,您不需要执行其中任何一项。