2017-08-16 87 views
7

私はPython 3.6を使用しており、以下のウェブサイト(以下のフルコードも参照)の最初の例に従います。以下のエラー: https://docs.python.org/3.6/library/multiprocessing.htmlPythonマルチプロセッシングエラー:AttributeError:module '__main__'に属性 '__spec__'がありません

エラーメッセージ: AttributeError: module '__main__' has no attribute '__spec__'

完全なサンプルコード:

from multiprocessing import Pool 

def f(x): 
    return x*x 

if __name__ == '__main__': 
    with Pool(5) as p: 
     print(p.map(f, [1, 2, 3])) 

私はスタックOverfloそれをグーグルで検索してみましたwしかし、私はこのエラーの1つの他のケースしか見つけず、答えがありませんでした。

+0

掲載のコードは、私は、Python 3.6でアナコンダ/スパイダーを使用しています私のマシン – bendl

+0

上で正常に動作します...多分それはそれとは何かを持っていますか? – user8474060

+0

私はWindows 7でPython 3.6.0(Anaconda 4.3.1)でSpyder 3.1.2を使用しています – bendl

答えて

13

問題はコード/ Python 3.6ではなく、Spyderにあります。

いくつか調査した結果、SpyderのIPythonコンソールで実行したときに、外部システム端末で実行するとコードが正常に動作することがわかりました。

Iはスペックの内容をダンプし、このコードはIPythonコンソール内で機能することを可能にするメイン内部に含まれた変数に割り当てることができました。

from multiprocessing import Pool 

def f(x): 
    return x*x 

if __name__ == '__main__': 
    __spec__ = "ModuleSpec(name='builtins', loader=<class '_frozen_importlib.BuiltinImporter'>)" 
    with Pool(5) as p: 
     print (p.map(f, [1, 2, 3])) 
+6

'__spec__'は通常は文字列ではないので、私は実際には驚いています。それがうまくいったので、恐らく 'None'を使うだけかもしれません。 – Kevin

+0

私は '__spec__ = __spec__'を試みました。私の子プロセスは無限に開始して停止し始めました。スクリプトがシステム端末で起動されたときに '__spec__'変数もチェックしました。それは 'None'です。ですから、私は '__spec__ = None'がこれを修正する「正しい」方法だと思います。 – Winand

関連する問題