9

我一直在玩 IPython.parallel 并且我想使用我自己的一些自定义模块,但无法按照食谱中的说明使用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()

4

1 回答 1

9

问题是您正在更改PYTHONPATH仅在运行客户端的本地进程中,而不是在运行在ipcluster.

如果您运行下一段代码,您可以观察到这种行为:

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

于 2013-09-02T10:14:17.997 回答