2013-09-02 10 views
8

私はIPython.parallelで遊んでいましたが、独自のカスタムモジュールを使用したいと考えていましたが、the cookbookdview.sync_imports()を使用してください。私のために働いている唯一のものはsync_imports()を使用してIPython.parallelエンジンでカスタムモジュールをインポートする

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()を使用してそれを行う正しい方法は何ですか?

+0

右ですが、sys.pathが行います。訂正しました! –

答えて

8

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にない場合は、リモートで実行する関数のパスに追加して、その関数でモジュールをインポートする必要があります。

+0

これは理にかなっています。私はそれを試してみるつもりです。動作する必要があります! –

+0

だから、私はそれをしましたが、何らかの理由でリモートエンジンがPYTHONPATHを正しく取得していません。リモートエンジンはどのような環境からPYTHONPATHを取得しますか?スクリプトを実行したのは?システムのデフォルトシェル? Pythonの設定ファイル?私はあなたの正確なスクリプトを実行し、PYTHONPATHが正しく設定されている、ローカルインポートは動作し、リモートインポートはしません。 –

+0

@AlexSどのようにリモートエンジンを始動しますか? 'ipcluster start -n 4'? –

関連する問題