如何在不导入模块的情况下更换模块?

时间:2014-09-19 22:19:27

标签: python python-2.7 python-import python-module

我想测试名为“x”的模块,该模块导入名为“y”的模块。问题是导入y需要几秒钟。如何编写x测试,用自己的模块替换y,同时阻止导入y?

我所知道的所有允许替换模块的Python库都需要先导入模块。

1 个答案:

答案 0 :(得分:2)

所以,假设我们有这些模块xy

# x.py
import y
y.foo()
# y.py
def foo():
    raise RuntimeError("Nope.")

鉴于这些模块,以下内容显然会失败:

# test_real.py
import x
$ python test_real.py 
Traceback (most recent call last):
File "test_real.py", line 2, in <module>
    import x
File "x.py", line 3, in <module>
    y.foo()
File "y.py", line 3, in foo
    raise RuntimeError("Nope.")
RuntimeError: Nope.

如果我们有假y(称为z):

# z.py
def foo():
    print "Yessir!"

...我们需要在导入x 之前说服Python,y已导入(用z替换它)。这其实很简单:

# test_fake.py
import sys
sys.modules['y'] = __import__('z')

import x

......它有效:

$ python test_fake.py 
Yessir!