所以,这里的情况是:
我使用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
检查正在完成。
你能帮我解决这个问题吗?我应该首先尝试什么?什么可能是这个失败的原因?
'type(yield)'返回什么? –
@KaustavDatta产生类型: –
我的猜测...我认为你导入了两个版本的类,一个是'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