2016-01-13 82 views
3

所以,这里的情况是:
我使用GAE Pipeline lib的流量,我班FanoutPipeline从管道类派生从库:isinstance()返回False由于未知原因,

from pipeline import pipeline 
class FanoutPipeline(pipeline.Pipeline): 

当管道进程运行,它检查,以验证该对象实际上是从管道派生的类的实例,但是它返回False:

yielded = pipeline_iter.send(next_value) 
    # here I check that yielded is an object of `FanoutPipeline` 
    # class, plz see logs output below 
    if isinstance(yielded, Pipeline): # returns false here 

我加了一吨的日志来获得分类及其模块:

import inspect 
    logging.debug('Yielded: {}'.format(yielded)) 
    for cls in inspect.getmro(yielded.__class__): 
     logging.debug('Yielded base: {}'.format(inspect.getmodule(cls))) 
     logging.debug('Yielded base: {}'.format(cls)) 
    logging.debug('PipelineMeta classes: {}'.format(_PipelineMeta._all_classes)) 
    logging.debug('Pipeline: {}'.format(Pipeline)) 
    logging.debug('Pipeline module: {}'.format(inspect.getmodule(Pipeline))) 
    for cls in inspect.getmro(Pipeline): 
    logging.debug(inspect.getmodule(cls)) 
    if isinstance(yielded, Pipeline): 

,并得到了输出:

D 21:55:48.079 Yielded: project.handlers.pipeline_gcm.FanoutPipeline(*(None, {u'campaign_id': u'xxx', u'campaign_name': u'xmas notification', u'execution': {u'action': u'market', u'conditions': {u'delayBetweenNotificationsHours': 0, u'in... (515 bytes), **{}) 
D 21:55:48.079 Yielded base: <module 'project.handlers.pipeline_gcm' from '/base/data/home/apps/s~project-dev3/9.389913797024223872/projects/handlers/pipeline_gcm.pyc'> 
D 21:55:48.079 Yielded base: <class 'project.handlers.pipeline_gcm.FanoutPipeline'> 
D 21:55:48.080 Yielded base: <module 'pipeline.pipeline' from '/base/data/home/apps/s~project-dev3/9.389913797024223872/libraries/pipeline/pipeline.pyc'> 
D 21:55:48.080 Yielded base: <class 'pipeline.pipeline.Pipeline'> 
D 21:55:48.080 Yielded base: <module '__builtin__' (built-in)> 
D 21:55:48.080 Yielded base: <type 'object'> 
D 21:55:48.081 PipelineMeta classes: [<class 'libraries.pipeline.pipeline.Pipeline'>] 
D 21:55:48.081 Pipeline: <class 'libraries.pipeline.pipeline.Pipeline'> 
D 21:55:48.081 Pipeline module: <module 'libraries.pipeline.pipeline' from '/base/data/home/apps/s~project-dev3/9.389913797024223872/libraries/pipeline/pipeline.pyc'> 
D 21:55:48.082 <module 'libraries.pipeline.pipeline' from '/base/data/home/apps/s~project-dev3/9.389913797024223872/libraries/pipeline/pipeline.pyc'> 
D 21:55:48.082 <module '__builtin__' (built-in)> 

正如你看到的,产生了具有明确pipeline.pipeline.Pipeline在基础班,模块路径匹配。

这里有一些想法为什么它会发生: 1.对象在进程之间以某种方式传递,并且检查失败,因为一个基类在一个进程中加载​​,另一个在另一个进程中加载​​。 2.存在相对路径的差异,即pipeline.pipeline模块正在创建过程中,其中创建了对象
和libraries.pipeline.pipeline,在使用它的过程中和isinstance检查正在完成。

你能帮我解决这个问题吗?我应该首先尝试什么?什么可能是这个失败的原因?

+1

'type(yield)'返回什么? –

+1

@KaustavDatta产生类型:

+2

我的猜测...我认为你导入了两个版本的类,一个是'libraries.pipeline.pipeline.Pipeline',另一个是' pipeline.pipeline.Pipeline'。这意味着你在'sys中有'/ base/data/home/apps/s〜project-dev3/9.389913797024223872 /'和'/ base/data/home/apps/s〜project-dev3/9.389913797024223872/libraries'。 path'。你不应该在你的Python路径中有'/ base/data/home/apps/s〜project-dev3/9.389913797024223872 /',也不应该导入'libraries.anything'。 – tdelaney

回答

1

您正在导入该课程的两个版本,一个为libraries.pipeline.pipeline.Pipeline,另一个为pipeline.pipeline.Pipeline。这意味着你在sys.path中有/base/data/home/apps/s~project-dev3/9.389913797024223872//base/data/home/apps/s~project-dev3/9.389913797024223872/libraries。虽然你知道它们只是两个通向同一模块的路径,但python并不知道它们,并将它们视为两个不同的类。

您需要决定是将您的导入作为libraries还是libraries中的各个模块,然后一致地编写导入。您还应该停止将“unchosen”目录添加到sys.path,以便以错误的方式导入模块失败。

相关问题