并行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

我正在使用并行Python模块(
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)