并行Python:将另一个模块中编写的函数传递给';提交';
我正在使用并行Python模块(并行Python:将另一个模块中编写的函数传递给';提交';,python,parallel-processing,parallel-python,Python,Parallel Processing,Parallel Python,我正在使用并行Python模块(pp),希望向工作人员提交作业。但是,我想要执行的函数在另一个模块中(用Cython编写),我不知道如何将函数名导入新的worker。建议的方法,即在函数中导入模块“walkerc”无法工作,因为walk本身是在walkerc中从文件名“walkerc.so”定义的 上述两条语句均失败,我得到以下错误: 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 ser.submit(walk,(1000,参数),modules=(“walkerc”,),globals
pp
),希望向工作人员提交作业。但是,我想要执行的函数在另一个模块中(用Cython编写),我不知道如何将函数名导入新的worker。建议的方法,即在函数中导入模块“walkerc”无法工作,因为walk本身是在walkerc中从文件名“walkerc.so”定义的
上述两条语句均失败,我得到以下错误:
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
ser.submit(walk,(1000,参数),modules=(“walkerc”,),globals=globals())
文件“/usr/lib/python2.7/site packages/pp.py”,第458行,提交
sfunc=self.\u dumpsfunc((func,)+depfuncs,modules)
文件“/usr/lib/python2.7/site packages/pp.py”,第629行,在
__转储函数
sources=[self.\uuuu获取\u func中func的源(func)]
文件“/usr/lib/python2.7/site packages/pp.py”,第696行,在
__获取源
sourcelines=inspect.getsourcelines(func)[0]
文件“/usr/lib/python2.7/inspect.py”,第690行,在getsourcelines中
行,lnum=findsource(对象)
文件“/usr/lib/python2.7/inspect.py”,第526行,在findsource中
file=getfile(对象)
文件“/usr/lib/python2.7/inspect.py”,第420行,在getfile中
“函数、回溯、帧或代码对象”。格式(对象))
TypeError:“”不是模块、类、方法,
函数、回溯、帧或代码对象
函数“walk”本身在主程序中正确导入,将其提交给新工作程序的过程存在问题
如何正确指定函数名“walk”?
我不想在我调用它的同一个文件中定义“walk”,因为我在Cython中对它进行了修改,希望有更好的性能。有其他选择吗?尝试将您的
walk
函数重命名为其他函数,例如mywalk
。正如异常文本所示,您的环境似乎有一个名为walk的内置函数,因此模块会混淆
我可以在我的系统上成功地传递导入的walk
函数,如下图所示,这里没有冲突,也不需要更多,该函数使用给定参数执行:
import pp
from walkerc import walk
pps = pp.Server()
pps.submit(walk, args=(1,))
但是传递,这肯定是一个内置函数:
pps.submit(dir)
我得到与您完全相同的错误:
谢谢你的建议。然而,这很奇怪,因为当我打开一个解释器并导入函数“mywalk”时,它显示为
。我想这是因为我从编译的.so文件导入它。如果我从.py模块导入它,它会作为
导入,我想真正的问题是如何导入Cython模块,这样它实际上与导入.py模块相同。谢谢你的指点,如果我解决了问题,我会接受这个答案。:)@阿比纳夫:你说得对,我错过了你的进口。所以。我只是设法复制了这个问题。如果我从导入,那么我也会得到“内置函数”错误。我现在正在进一步研究:)刚才看到,如果执行import inspect
,然后执行inspect.isfunction(walkerc.mywalk)
,则.so模块显示False
,而.py模块显示True
。isfunction
中的文档说明,如果对象是用户定义的函数,它将返回True
。这需要.so模块中不存在的属性func\u code
,大概是因为它不是字节编译的?那么,这是否意味着没有办法做到这一点呢?@Abhinav是的,同样如此。最初并不清楚,但根据和其他一些参考资料,扩展通常被认为是内置的,Python就是这样对待它们的,包括inspect
模块。我试图将扩展函数调用封装在一个普通的Python函数中,但迄今为止没有成功。
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
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)