私はIPythonのドキュメント/チュートリアルを読んだり読み直したりしてきましたが、この特定のコードの問題を理解できません。各エンジンに配信される名前空間には関数dimensionless_run
が表示されないようですが、関数はで定義されており__main__
、グローバル名前空間の一部として明確に表示されるため、混乱しています。
wrapper.py:
import math, os
def dimensionless_run(inputs):
output_file = open(inputs['fn'],'w')
...
return output_stats
def parallel_run(inputs):
import math, os ## Removing this line causes a NameError: global name 'math'
## is not defined.
folder = inputs['folder']
zfill_amt = int(math.floor(math.log10(inputs['num_iters'])))
for i in range(inputs['num_iters']):
run_num_str = str(i).zfill(zfill_amt)
if not os.path.exists(folder + '/'):
os.mkdir(folder)
dimensionless_run(inputs)
return
if __name__ == "__main__":
inputs = [input1,input2,...]
client = Client()
lbview = client.load_balanced_view()
lbview.block = True
for x in sorted(globals().items()):
print x
lbview.map(parallel_run,inputs)
後にこのコードを実行すると、 andモジュール、およびand関数ipcluster start --n=6
を含むソートされたグローバルディクショナリが生成されます。この後にIPython.parallel.error.CompositeErrorが続きます。メソッドの呼び出しからの1つ以上の例外:parallel_run。これは多数の、で構成され、nは0から5まで実行されます。math
os
parallel_run
dimensionless_run
[n:apply]: NameError: global name 'dimensionless_run' is not defined
私が理解していないことが2つあり、それらは明確に関連しています。
dimensionless_run
コードがグローバル名前空間で識別されないのはなぜですか?- parallel_runの定義内
import math, os
で必要なのはなぜですか?
編集:これは名前空間エラーの多くではないことが判明しました-私はipcluster start --n=6
コードが含まれていないディレクトリで実行していました。これを修正するには、コードのディレクトリでstartコマンドを実行するだけで済みました。また、次の行を追加して修正しました。
inputs = input_pairs
os.system("ipcluster start -n 6") #NEW
client = Client()
...
lbview.map(parallel_run,inputs)
os.system("ipcluster stop") #NEW
必要なクラスターを適切な場所で開始します。