2016-01-13 122 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,以便以錯誤的方式導入模塊失敗。

相關問題