我正在使用Parallel Python模块(pp
),并希望将作业提交给worker。但是,我要执行的函数在另一个模块中(用Cython编写),我不知道如何将函数名导入新的worker。建议的方法here,即在函数内导入模块“walkerc”无法工作,因为walker本身是在walkerc中定义的,来自文件名“沃克·索““
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())
以上两个语句都失败了,我得到以下错误:
Traceback (most recent call last):
File "", line 1, in ser.submit(walk, (1000, params), modules = ("walkerc",), globals = globals())
File "/usr/lib/python2.7/site-packages/pp.py", line 458, in submit sfunc = self.__dumpsfunc((func, ) + depfuncs, modules)
File "/usr/lib/python2.7/site-packages/pp.py", line 629, in __dumpsfunc sources = [self.__get_source(func) for func in funcs]
File "/usr/lib/python2.7/site-packages/pp.py", line 696, in __get_source sourcelines = inspect.getsourcelines(func)[0]
File "/usr/lib/python2.7/inspect.py", line 690, in getsourcelines lines, lnum = findsource(object)
File "/usr/lib/python2.7/inspect.py", line 526, in findsource file = getfile(object)
File "/usr/lib/python2.7/inspect.py", line 420, in getfile 'function, traceback, frame, or code object'.format(object))
TypeError: '<'built-in function walk'>' is not a module, class, method, function, traceback, frame, or code object
函数'walk'本身是在主程序中正确导入的,它是将它提交给新工人的过程中有问题的。在
如何正确指定函数名'walk'? 我不想在我称之为'walk'的同一个文件中定义它,因为我在Cython中修改了它,并希望有更好的性能。有其他选择吗?在
尝试将} 模块会混淆。在
walk
函数重命名为其他函数,mywalk
例如。如异常文本所示,您的环境似乎有一个名为walk
的内置函数,因此^{我可以像这样在我的系统上成功地传递导入的
walk
函数,这里没有冲突,也没有更多需要的东西,该函数使用给定的参数执行:但是传递^{} ,这肯定是一个内置函数:
^{pr2}$我得到和你完全一样的错误:
以下讨论后更新:
所以这里的问题是Python将来自C extensions的成员视为内置的。上面的代码可以与常规Python模块一起工作,但是当从C扩展导入和传递函数时,我可以复制OP的错误。在
因此,我将C扩展函数调用包装在一个普通的Python函数中,这样就可以做到这一点。注意,现在
walk
函数导入被移到包装函数中,这样它可以在调度时自己构造上下文。在相关问题 更多 >
编程相关推荐