动态导入的模块类中的python 2.7 isinstance失败

时间:2013-06-18 21:37:12

标签: python python-2.7 import isinstance dynamic-import

我目前正在编写某种小型api来支持扩展模块类。用户应该能够在配置中编写他们的类名,并在我们的程序中使用它。合同是,类'模块有一个名为create(**kwargs)的函数来返回我们的基本模块类的实例,并放在一个特殊的文件夹中。但是一旦动态导入,isinstance检查就会失败。

模块放在lib / services / 名称

模块基类(在lib / services / service中)

class Service:
    def __init__(self, **kwargs):
        #some initialization

示例模块类(在lib / services / ping中)

class PingService(Service):
    def __init__(self, **kwargs):
        Service.__init__(self,**kwargs)
        # uninteresting init

def create(kwargs):
    return PingService(**kwargs)

导入功能

import sys
from lib.services.service import Service

def doimport( clazz, modPart, kw, class_check):
    path = "lib/" + modPart
    sys.path.append(path)
    mod = __import__(clazz)
    item = mod.create(kw)

    if class_check(item):
        print "im happy"
        return item

调用代码

class_check = lambda service: isinstance(service, Service)
s = doimport("ping", "services", {},class_check)

print s

from lib.services.ping import create

pingService = create({})
if isinstance(pingService, Service):
    print "why this?"

我到底做错了什么

这是一个拉链的小例子,只需提取并运行test.py而不带参数 zip example

1 个答案:

答案 0 :(得分:2)

问题出在您的ping.py文件中。我不确切知道为什么,但是当进行dinamically导入时它不接受行from service import Service,所以你只需要将它改为相对路径:from lib.services.service import Service。将lib/services添加到sys.path无法使其继承,我发现这很奇怪......

另外,我使用的imp.load_source似乎更强大:

import os, imp
def doimport( clazz, modPart, kw, class_check):
    path = os.path.join('lib', modPart, clazz + '.py')
    mod = imp.load_source( clazz, path )
    item = mod.create(kw)

    if class_check(item):
        print "im happy"
        return item