IPython.parallel名称空间

IPython.parallel名称空间,python,ipython,starcluster,Python,Ipython,Starcluster,我想使用IPython.parallel并行化一个函数,并且在定义它时 在IPython外壳中,它可以完美地工作: Type: function Base Class: <type 'function'> String Form:<function gradient at 0x3ae0398> Namespace: Interactive File: /root/<ipython-input-30-cf7eabdfef84> Defi

我想使用IPython.parallel并行化一个函数,并且在定义它时 在IPython外壳中,它可以完美地工作:

Type:       function
Base Class: <type 'function'>
String Form:<function gradient at 0x3ae0398>
Namespace:  Interactive
File:       /root/<ipython-input-30-cf7eabdfef84>
Definition: gradient(w) 
Source:
def gradient(w):
    s = (1.0 + exp(y * (X * w)))**-1
    return C*X.T*((1 - s) * y)

rc = Client() 
rc[:].apply_sync(gradient, w)
...
类型:函数
基类:
字符串形式:
名称空间:交互式
文件:/root/
定义:梯度(w)
资料来源:
def梯度(w):
s=(1.0+exp(y*(X*w))**-1
返回C*X.T*((1-s)*y)
rc=客户机()
rc[:]。应用同步(渐变,w)
...
但是,当我在模块中定义它并使用导入时:

Type:       function
Base Class: <type 'function'>
String Form:<function gradient at 0x3933d70>
Namespace:  Interactive
File:       /root/mv.py
Definition: mv.gradient(w)
Source:
def gradient(w):
    s = (1.0 + exp(y * (X * w)))**-1
    return C*X.T*((1 - s) * y)

import mv 
rc = Client()
rc[:].apply_sync(mv.gradient, w)

CompositeError: one or more exceptions from call to method: gradient
[0:apply]: NameError: global name 'y' is not defined
[1:apply]: NameError: global name 'y' is not define
类型:函数
基类:
字符串形式:
名称空间:交互式
文件:/root/mv.py
定义:中压梯度(w)
资料来源:
def梯度(w):
s=(1.0+exp(y*(X*w))**-1
返回C*X.T*((1-s)*y)
进口mv
rc=客户机()
rc[:]应用同步(mv.gradient,w)
CompositeError:调用方法的一个或多个异常:gradient
[0:应用]:名称错误:未定义全局名称“y”
[1:应用]:名称错误:未定义全局名称“y”
此外,在运行Python2.7.2/IPython 0.12的本地系统中,它运行良好,而 它在使用最新的Starcluster Ubuntu AMI的Python 2.7.2+/IPython 0.12上崩溃

这是怎么回事


更新:我从github安装了IPython 0.13.dev版本,现在它可以工作了

不同之处在于模块全局。在模块中定义函数时,全局名称空间是该模块的名称空间(即
mv.y
)。当该模块为
\uuuuu main\uuuuuu
时,例如交互定义的函数,则全局名称空间是引擎上的用户,受
执行(“y=5”)
的影响

如果您希望在模块中定义函数,并且这些函数的行为应与交互定义的函数相同(可以作为全局函数访问用户命名空间),则IPython提供了一个装饰器:

#mymod 从IPython.parallel.util导入交互式 @互动的 由_a(b)提供的def: “”“将a乘以b” 返回a*b 以交互方式,您可以执行以下操作:

from mymod import by_a e0 = rc[0] e0.execute("a=5") print e0.apply_sync(by_a, 10) # 50 e0.execute("a=10") print e0.apply_sync(by_a, 10) # 100 从mymod导入 e0=rc[0] e0.执行(“a=5”) 打印e0.apply_sync(按_a,10)#50 e0.执行(“a=10”) 打印e0.apply_sync(按_a,10)#100
您在哪里设置
x
y
?它们不是函数的参数,那么它们来自哪里?这似乎是问题的原因。我在init函数中设置了它们:对于c,f在zip(rc,files)中:c.execute(“X,y=load…” from mymod import by_a e0 = rc[0] e0.execute("a=5") print e0.apply_sync(by_a, 10) # 50 e0.execute("a=10") print e0.apply_sync(by_a, 10) # 100