2012-05-05 29 views
1

私はIPython.parallelを使用して機能を並列化したい、と私はシェルIPythonで それを定義するとき、それは完璧に動作:IPython.parallel名前空間

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) 
... 

しかし、私はモジュールと、使用中、それを定義するときインポート: それは、最新のStarcluster UbuntuのAMIを使用して+/IPython 0.12のPython 2.7.2でクラッシュしながら

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 

はさらに、それは、罰金1にはPython 2.7.2/IPython 0.12を実行している私のローカルシステムで動作します。

ここでは何が起こっていますか?

アップデート:githubからIPython 0.13.devをインストールしました。

+0

ここで、「x」と「y」を設定しますか?彼らは関数のパラメータではないので、彼らはどこから来ますか?それは問題の原因と思われる。 – mata

+0

私はそれらをinit関数で設定します:for c、zip(rc、files):f.execute( "X、y = load ..." – kyrre

答えて

3

違いはモジュールのグローバルです。関数がモジュール内で定義されている場合、グローバル名前空間はモジュールの名前空間(すなわち、mv.y)です。そのモジュールが__main__の場合、インタラクティブに定義された関数の場合、グローバル名前空間はエンジン上のuser_nsであり、execute("y=5")の影響を受けます。

IPythonは、あなたが(グローバルなどのユーザの名前空間へのアクセス権を持っている)彼らが対話的に定義されているかのように振る舞うべきモジュール内の関数を定義したい場合は、デコレータを提供しています。

 
# mymod 

from IPython.parallel.util import interactive 

@interactive 
def by_a(b): 
    """multiply a by b" 
    return 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