2014-06-27 42 views
3

我有一個實例化對象object.This內部調用不是運行多處理模塊的方法的sconstruct腳本。下面所示使用SCons AttributeError的:「builtin_function_or_method」對象有沒有屬性「調度」

例如該對象之前調用函數unpickles一個文件,並通過輸入多處理模塊。

def run_scons(self,inpfile,outfile): 

     # Unpickle input parameter 
     fid=open(inpfile,'rb') 
     input_data=pkls.load(fid) 
     my_results=[] 
     #run solver in loop 
     for my_data in input_data: 
      work_ers=len(my_data) 
      pool = Pool(processes=work_ers) 
      a_result=pool.map_async(my_solver, my_data) 
      pool.close() 
      pool.join() 
      my_results.append(a_result.get()) 
     fid.close() 

     fid_out=open(outfile,'wb+') 
     pkls.dump(rot_full_results,fid_out) 

當通過scons執行相同的函數時,出現以下錯誤。

pool = Pool(processes=work_ers) 
    File "C:\Python27\lib\multiprocessing\__init__.py", line 232, in Pool 
    return Pool(processes, initializer, initargs, maxtasksperchild) 
    File "C:\Python27\lib\multiprocessing\pool.py", line 138, in __init__ 
    self._setup_queues() 
    File "C:\Python27\lib\multiprocessing\pool.py", line 232, in _setup_queues 
    from .queues import SimpleQueue 
    File "C:\Python27\lib\multiprocessing\queues.py", line 48, in <module> 
    from multiprocessing.synchronize import Lock, BoundedSemaphore, Semaphore, Condition 
    File "C:\Python27\lib\multiprocessing\synchronize.py", line 48, in <module> 
    from multiprocessing.forking import assert_spawning, Popen 
    File "C:\Python27\lib\multiprocessing\forking.py", line 60, in <module> 
    class ForkingPickler(Pickler): 
    File "C:\Python27\lib\multiprocessing\forking.py", line 61, in ForkingPickler 
    dispatch = Pickler.dispatch.copy() 
AttributeError: 'builtin_function_or_method' object has no attribute 'dispatch' 
scons: building terminated because of errors. 

閱讀有關此錯誤後,我發現SCons的大約有它重命名泡菜模塊cPickle的,而多處理器模塊正在尋找的cPickle一個黑客,一切都下降。有沒有辦法解決?

+0

我找到了更新。對於scipy構建他們有同樣的問題。 (http://comments.gmane.org/gmane.comp.programming.tools.scons.user/21764)我不知道如何設置在sconstruct文件這個變量「SCONS_HORRIBLE_REGRESSION_TEST_HACK」。 – Sri

回答

2

我使用多並行處理一些「工作」的文件。我做這樣的事情在我SConstruct文件:

if GetOption("run_jobs"): 

    my_jobs = # some code that produces a list of job objects 

    ecode = build_support.mp_run_jobs(my_jobs) 

    Exit(ecode) 

但後來我碰到了上面的異常:

AttributeError: 'builtin_function_or_method' object has no attribute 'dispatch' 

在Linux上使用 'SCONS_HORRIBLE_REGRESSION_TEST_HACK' 的工作原理:

$ SCONS_HORRIBLE_REGRESSION_TEST_HACK=1 scons --run-jobs 

但我不希望有這個符號出口在Linux和Windows和Mac等

我沒有找到一個解決辦法,刪除鹹菜模塊,並重新導入它們是這樣的:

if GetOption("run_jobs"): 

    # Workaround SCons.compat module renaming 

    import imp 

    del sys.modules['pickle'] 
    del sys.modules['cPickle'] 

    sys.modules['pickle'] = imp.load_module('pickle', *imp.find_module('pickle')) 
    sys.modules['cPickle'] = imp.load_module('cPickle', *imp.find_module('cPickle')) 

    import pickle 
    import cPickle 

    print "(pickle == cPickle) = ", (pickle == cPickle) 

    my_jobs = # some code that produces a list of job objects 

    ecode = build_support.mp_run_jobs(my_jobs) 

    Exit(ecode) 

現在可以按預期我對工作多!

+0

謝謝,非常有幫助!你知道是否可以定義這個系統範圍內的(整個SCons構建的)還是SCons會以某種方式壞,如果我這樣做?在後一種情況下,我只能在我使用多處理模塊的地方定義它(或者我猜是使用cPickle)。 –

相關問題