Python 2.7 Scons AttributeError:&x27;内置函数或方法';对象没有属性';调度';

Python 2.7 Scons AttributeError:&x27;内置函数或方法';对象没有属性';调度';,python-2.7,multiprocessing,scons,Python 2.7,Multiprocessing,Scons,我有一个sconstruct脚本正在实例化一个对象。这个对象在内部调用一个方法,而不是运行多处理模块。示例如下所示 调用函数之前,此对象将取消勾选文件并将输入传递给多处理模块 def run_scons(self,inpfile,outfile): # Unpickle input parameter fid=open(inpfile,'rb') input_data=pkls.load(fid) my_results=[]

我有一个sconstruct脚本正在实例化一个对象。这个对象在内部调用一个方法,而不是运行多处理模块。示例如下所示

调用函数之前,此对象将取消勾选文件并将输入传递给多处理模块

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)
当通过SCON执行相同的函数时,我得到以下错误

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.
pool=pool(进程=工作)
池中第232行的文件“C:\Python27\lib\multiprocessing\\uuuu init\uuuu.py”
返回池(进程、初始值设定项、initargs、maxtasksperchild)
文件“C:\Python27\lib\multiprocessing\pool.py”,第138行,在\uuuu init中__
self.\u设置\u队列()
文件“C:\Python27\lib\multiprocessing\pool.py”,第232行,在设置队列中
从队列导入SimpleQueue
文件“C:\Python27\lib\multiprocessing\queues.py”,第48行,在
来自multiprocessing.synchronize导入锁、绑定信号量、信号量、条件
文件“C:\Python27\lib\multiprocessing\synchronize.py”,第48行,在
从multiprocessing.forking导入断言\u生成,Popen
文件“C:\Python27\lib\multiprocessing\forking.py”,第60行,在
类别分叉酸洗器(酸洗器):
文件“C:\Python27\lib\multiprocessing\forking.py”,第61行,在ForkingPickler中
dispatch=Pickler.dispatch.copy()
AttributeError:“内置函数”或“方法”对象没有属性“分派”
scons:由于错误而终止生成。

在阅读了有关此错误的信息后,我发现SCONS有一个将pickle模块重命名为cPickle的漏洞,而多处理模块正在查找cPickle,因此一切都失败了。这有什么办法吗

我正在使用多处理并行处理一些“作业”文件。我在我的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\u可怕的\u回归\u测试\u黑客”可以:

$ SCONS_HORRIBLE_REGRESSION_TEST_HACK=1 scons --run-jobs
但我不想在Linux、Windows和Mac等平台上导出这个符号

我确实找到了一个解决办法,删除pickle模块,然后像这样重新导入它们:

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)

现在,我的作业多处理工作如预期

我发现了一个更新。对于scipy构建,它们也有同样的问题。()我不知道如何在sconstruct文件中设置这个变量“SCONS\u可怕的\u回归\u测试\u HACK”。谢谢,非常有用!你知道定义这个系统范围(整个SCons构建)可以吗?或者如果我这样做的话,SCons在某些方面会变坏吗?在后一种情况下,我必须只在使用多处理模块(或者我猜是使用cPickle)的地方定义它。