我一直在玩IPython.parallel,我想使用我自己的一些自定义模块,但是无法按照the cookbook使用dview.sync_imports()
的说明进行操作。对我来说唯一有用的东西就像是
def my_parallel_func(args):
import sys
sys.path.append('/path/to/my/module')
import my_module
#and all the rest
然后在主要的
if __name__=='__main__':
#set up dview...
dview.map( my_parallel_func, my_args )
在我看来,正确的方法是
with dview.sync_imports():
import sys
sys.path.append('/path/to/my/module')
import my_module
但是这会抛出错误,说没有名为my_module
的模块。
那么,使用dview.sync_imports()
??
答案 0 :(得分:8)
问题是您只是在运行客户端的本地进程中更改PYTHONPATH
,而不是在ipcluster
中运行的远程进程中更改。{/ p>
如果你运行下一代代码,你可以观察到这种行为:
from IPython.parallel import Client
rc = Client()
dview = rc[:]
with dview.sync_imports():
import sys
sys.path[:] = ['something']
def parallel(x):
import sys
return sys.path
print 'Local: ', sys.path
print 'Remote: ', dview.map_sync(parallel, range(1))
基本上,您要与sync_imports
一起使用的所有模块都必须位于PYTHONPATH
。
如果它不在PYTHONPATH
中,则必须将其添加到远程执行的函数中的路径,然后在函数中导入模块。