Python:如何导入包两次?

时间:2015-09-19 12:08:32

标签: python import package

有没有办法在同一个python会话中以相同的名称,但在不同的范围内,在多线程环境中导入包两次?

我想导入包,然后覆盖它的一些函数,只有在特定的类中使用时才能改变它的行为。

例如,是否有可能实现这样的目标?

import mod

class MyClass:

  mod = __import__('mod')

  def __init__():
     mod.function = new_function # override module function

  def method():
     mod.function() # call new_function

mod.function() # call original function

这可能看起来很奇怪,但在这种情况下,派生类的用户不必更改其代码以使用改进的包。

2 个答案:

答案 0 :(得分:2)

将模块导入为副本:

def freshimport(name):
    import sys, importlib
    if name in sys.modules:
        del sys.modules[name]
    mod = importlib.import_module(name)
    sys.modules[name] = mod
    return mod

测试:

import mymodule as m1
m2 = freshimport('mymodule')
assert m1.func is not m2.func

注意

importlib.reload将无法完成这项工作,因为它始终"若有所思地"更新旧模块:

import importlib
import mymodule as m1
print(id(m1.func))
m2 = importlib.reload(m1)
print(id(m1.func))
print(id(m2.func))

示例输出:

139681606300944
139681606050680
139681606050680

答案 1 :(得分:1)

它看起来像是一个上下文管理器的工作

import modul

def newfunc():
    print('newfunc')

class MyClass:
    def __enter__(self):
        self._f = modul.func
        modul.func = newfunc
        return self

    def __exit__(self, type, value, tb):
        modul.func = self._f

    def method(self):
        modul.func()


modul.func()
with MyClass() as obj:
    obj.method()
    modul.func()
modul.func()

输出

func
newfunc
newfunc
func

modul.py包含

def func():
    print('func')

注意:此解决方案仅适用于单线程应用程序(在OP中未指定)