我正在使用Parallel Python模块(pp
),并希望向工作人员提交作业。但是,我想要执行的函数是在另一个模块中(用Cython编写),我不知道如何将函数名称导入新的worker。方法建议here,即导入函数内部的“walkerc”模块无法工作,因为walk本身是在walkerc中定义的,来自文件名“walkerc.so”
import pp
from walkerc import walk
# Other stuff here
ser = pp.Server()
# Some more definitions
ser.submit(walk, (it, params))
ser.submit(walk, (1000, params), modules = ("walkerc",), globals = globals())
上述两个语句都失败了,我收到以下错误:
追踪(最近一次呼叫最后一次):
文件“”,第1行,in ser.submit(walk,(1000,params),modules =(“walkerc”,),globals = globals())
文件“/usr/lib/python2.7/site-packages/pp.py”,第458行,提交 sfunc = self .__ dumpsfunc((func,)+ depfuncs,modules)
文件“/usr/lib/python2.7/site-packages/pp.py”,第629行, __dumpsfunc sources = [self .__ get_source(func)for func in funcs]
文件“/usr/lib/python2.7/site-packages/pp.py”,第696行, __get_source sourcelines = inspect.getsourcelines(func)[0]
文件“/usr/lib/python2.7/inspect.py”,第690行,在getsourcelines中 lines,lnum = findsource(object)
文件“/usr/lib/python2.7/inspect.py”,第526行,在findsource中 file = getfile(object)
文件“/usr/lib/python2.7/inspect.py”,第420行,在getfile中 'function,traceback,frame or code object'.format(object))
TypeError:'<'内置函数walk'>'不是模块,类,方法, 函数,回溯,框架或代码对象
函数'walk'本身是在主程序中正确导入的,它是将它提交给有问题的新工作者的过程。
如何正确指定功能名称'walk'? 我不想在我调用它的同一个文件中定义'walk',因为我已经在Cython中对其进行了修改并希望获得更好的性能。还有其他选择吗?
答案 0 :(得分:2)
尝试将walk
功能重命名为其他功能,例如mywalk
。正如异常文本所示,您的环境似乎有一个名为walk
的内置函数,因此inspect
模块会混淆。
我可以在我的系统上成功传递我这样导入的walk
函数,这里没有冲突而且不再需要,使用给定的参数执行函数:
import pp
from walkerc import walk
pps = pp.Server()
pps.submit(walk, args=(1,))
但是传递dir
,这是一个内置函数肯定:
pps.submit(dir)
我得到与你完全相同的错误:
Traceback (most recent call last): File "parallel.py", line 9, in pps.submit(dir) ... File ".../lib/python2.7/inspect.py", line 420, in getfile 'function, traceback, frame, or code object'.format(object)) TypeError: is not a module, class, method, function, traceback, frame, or code object
因此,问题在于Python将来自C extensions的成员视为内置函数。上面的代码适用于常规Python模块,但是当从C扩展中导入和传递函数时,我能够复制OP的错误。
因此,我将C扩展函数调用包装在一个普通的Python函数中,这样就可以了。请注意,现在walk
函数导入已移至包装函数,因此它可以在调度时构建它自己的上下文。
import pp
def walk(n):
import walkerc
return walkerc.walk(n)
def print_callback(result):
print('callback: ', result)
pps = pp.Server()
job = pps.submit(walk, args=(1,), callback=print_callback)