使用sync_imports()在IPython.parallel引擎上导入自定义模块

时间:2013-09-02 09:42:18

标签: python ipython ipython-parallel

我一直在玩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() ??

进行此操作的正确方法是什么?

1 个答案:

答案 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中,则必须将其添加到远程执行的函数中的路径,然后在函数中导入模块。