56814


質問下部に示すPythonのコードで，以下のエラーメッセージが出て対処の仕方がわかりません．

[code]

    Traceback (most recent call last):
      File "LSVM_multi.py", line 62, in <module>
        with multiprocessing.Pool(Thread_num) as p:
    AttributeError: __exit__
    
[/code]

下記のPythonのコードをどのように修正したらよいかご教授宜しくお願いします．

[code]

    #!/usr/bin/env python
    # coding: utf-8
    
    from sklearn import svm
    import numpy as np
    import csv
    import multiprocessing
    
    inputFilename = "tvCorrelationCoefALL_NTrials.csv"
    outputFilename = "result_linearSVM_L2_L2.csv"
    
    
    # csv読み込み
    # 1次元: [1列目, 2列目] = [係数, (クラス1, クラス2) = (1, -1)]
    data = np.loadtxt(inputFilename, delimiter=",")
    
    X = data[:,0]   # 係数を取得
    y = data[:,1]   # クラスラベルを取得
    
    print("file read complete")
    
    X = X.reshape(-1, 1)
    
    # --------------------------------------
    
    # 試行回数（中央値をとるため奇数）
    iteration = 101
    iteration += 1
    
    # 使用するCPUコア数
    Thread_num = 2
    
    # 結果格納の配列
    result = []
    
    def getArr(X,y):
        iterArr = []
        # for文でCの最適値を算出
        for i in [1]+list(range(10, 10001, 10)):
            # 線形SVMのインスタンスを生成
            model = svm.LinearSVC(penalty='l2', loss='squared_hinge',dual=True, C=i, max_iter=1000000)
    
            # モデルの学習．fit関数
            model.fit(X, y)
    
            # 境界線
            line = -model.intercept_ / model.coef_
    
            # 配列
            iterArr.append(line)
    
        return iterArr
    
    
    def wrapper_getArr(args):
        return getArr(*args)
    
    
    for k in range(0, int(iteration/Thread_num), 1):
        variable = []
        for i in range(Thread_num):
            variable.append([X,y])
    
        with multiprocessing.Pool(Thread_num) as p:
            # (X,y)
            iterArr = p.map(wrapper_getArr, variable)
    
        for temp in iterArr:
            # 配列に連結
            result.append(temp)
    
    
        # 確認
        print(k)
    
    
    # 結果をCSV出力
    with open(outputFilename, 'w') as file:
        writer = csv.writer(file, lineterminator='\n')
        writer.writerows(result)
    
    
    print("Program end")
    
[/code]


CC BY-SA 4.0
2019-07-22T08:55:59.627
56812
2019-07-22T09:44:07.540
2019-07-22T09:06:44.680
30173
30173
question
python
Pythonで，AttributeError: __exit__　のエラーが出たのですが，解消するためにどのようにコードを修正したらよいかわかりません


実行環境が`python 2.7`など`3.3`より前のバージョンの場合は、`with
multiprocessing.Pool`で質問に記載された[例外が出ます](https://stackoverflow.com/a/25968716)。

### テストコード例

[code]

    import multiprocessing
    
    def power(n):
        return n * n
    
    def main():
        with multiprocessing.Pool(2) as p:
            res = p.map(power, list(range(3)))
            print(res)
    
    if __name__ == "__main__":
        main()
    
[/code]

**python 3.6**

[code]

    [0, 1, 4]
    
[/code]

**python 2.7**

[code]

      File "test.py", line 20, in <module>
        main()
      File "test.py", line 13, in main
        with multiprocessing.Pool(n_cores) as p:
    AttributeError: __exit__
    
[/code]

バージョン問題に該当する場合は、リンク先の回答や下記の回避コードのように[`contextlib.closing`](https://docs.python.org/2/library/contextlib.html#contextlib.closing)の使用を検討してください。

### 回避コード例

[code]

    from multiprocessing import Pool
    from contextlib import closing
    
    def power(n):
        return n * n
    
    def main():
        with closing(Pool(2)) as p:
            res = p.map(power, list(range(3)))
            print(res)
            p.terminate()
    
    if __name__ == "__main__":
        main()
    
[/code]


CC BY-SA 4.0
2019-07-22T09:44:07.540
56814
2019-07-22T09:44:07.540
9820
56812
answer