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

Ale*_*x S 8 python ipython ipython-parallel

我一直在玩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
Run Code Online (Sandbox Code Playgroud)

然后在主要的到

if __name__=='__main__':
     #set up dview...
     dview.map( my_parallel_func, my_args )
Run Code Online (Sandbox Code Playgroud)

在我看来,正确的方法是这样的

 with dview.sync_imports():
     import sys
     sys.path.append('/path/to/my/module')
     import my_module
Run Code Online (Sandbox Code Playgroud)

但是这会抛出一个错误,说没有命名的模块my_module.

那么,使用它的正确方法是什么dview.sync_imports()

Vik*_*kez 8

问题是你正在改变PYTHONPATH运行客户端的本地进程中的just,而不是在运行的远程进程中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))
Run Code Online (Sandbox Code Playgroud)

基本上,您要使用的所有模块sync_imports必须已经在PYTHONPATH.

如果它不在PYTHONPATH那时你必须将它添加到远程执行的函数中的路径,然后在函数中导入模块.

  • 就像一个提示:运行`ipcluster start -n 4`的工作目录位于`PYTHONPATH`中.如果所有必需的自定义模块都在同一目录中,则从该目录运行`ipcluster`是一种可行的方法. (4认同)