Python 2.7 Scons AttributeError:&x27;内置函数或方法';对象没有属性';调度';
我有一个sconstruct脚本正在实例化一个对象。这个对象在内部调用一个方法,而不是运行多处理模块。示例如下所示 调用函数之前,此对象将取消勾选文件并将输入传递给多处理模块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=[]
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)的地方定义它。