2013-09-02 5 views
8

Ich habe mit IPython.parallel gespielt und ich wollte einige benutzerdefinierte Module verwenden, aber ich konnte es nicht tun, wie unter the cookbook erläutert mit dview.sync_imports(). Das einzige, was für mich gearbeitet hat war so etwas wieImportieren Sie benutzerdefinierte Module auf IPython.parallel Engines mit sync_imports()

def my_parallel_func(args): 
    import sys 
    sys.path.append('/path/to/my/module') 
    import my_module 
    #and all the rest 

und dann im Haupt nur

if __name__=='__main__': 
    #set up dview... 
    dview.map(my_parallel_func, my_args) 

Die richtige Art und Weise so etwas wie

sein, diese würde meiner Meinung nach tun
with dview.sync_imports(): 
    import sys 
    sys.path.append('/path/to/my/module') 
    import my_module 

, aber dies wirft einen Fehler, der besagt, dass es kein Modul mit dem Namen my_module gibt.

Also, was ist der richtige Weg, es mit dview.sync_imports() ??

+0

richtig, aber sys.path tut. Korrigiert es! –

Antwort

8

Das Problem ist, dass Sie die PYTHONPATH nur in dem lokalen Prozess ändern, auf dem der Client ausgeführt wird, und nicht in den Remote-Prozessen, die in ipcluster ausgeführt werden.

Sie können dieses Verhalten beobachten, wenn Sie das nächste Frieden Code ausführen:

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

Grundsätzlich alle Module, die Sie mit sync_imports verwenden möchten bereits im PYTHONPATH sein muss.

Wenn es nicht in der PYTHONPATH ist, dann müssen Sie es zum Pfad in der Funktion hinzufügen, die Sie remote ausführen, und importieren Sie das Modul dann in der Funktion.

+0

Ja, das macht Sinn. Ich werde es ausprobieren. Sollte arbeiten! –

+0

Ok, also habe ich das gemacht, aber aus irgendeinem Grund bekommen die Remote-Engines den PYTHONPATH nicht richtig. Aus welcher Umgebung erhalten die Remote-Engines ihren PYTHONPATH? Derjenige, von dem ich das Skript ausgeführt habe? Die Standard-Shell für das System? Python-Konfigurationsdateien? Ich habe Ihr genaues Skript ausgeführt, PYTHONPATH ist korrekt konfiguriert, der lokale Import funktioniert, der Remote-Import funktioniert nicht. –

+0

@AlexS Wie starten Sie die Remote-Engines? 'ipcluster start -n 4'? –

Verwandte Themen