Help us understand the problem. What is going on with this article?

Python3.7にアップデートしてパッケージをインストールしようとするとエラーが出て失敗する場合の対処法

More than 1 year has passed since last update.

Python 3.7が公開されたので早速使ってみたのですが、scikit-learnpip installしようとすると以下のようなエラーが大量に発生してインストールできませんでした。

sklearn/cluster/_dbscan_inner.cpp:6034:13: error: ‘PyThreadState {aka struct _ts}’ has no member named ‘exc_traceback’; did you mean ‘curexc_traceback’?
     tstate->exc_traceback = local_tb;
             ^~~~~~~~~~~~~
             curexc_traceback

scikit-learn以外でも同じエラーが発生してパッケージがインストールできないものがあったので、原因を調べると、Python 3.7の C API の改善の関係で、Cythonが吐き出すコードに修正をする必要があったことが原因のようです(参照)。すでにCythonの方はPython 3.7に対応済みなので、パッケージの方のCコードを再生成するとエラーは消えてインストールできるようになります。

ソースコードをダウンロードしてpip installするとインストールできるようになる場合もありますが、scikit-learn`の場合は、GitHibのリリースからソースコードをダウンロード( https://github.com/scikit-learn/scikit-learn/archive/0.19.1.tar.gz )して、そのままインストールしようとすると次のような別のエラーが発生します。

[17/40] Cythonizing sklearn/metrics/cluster/expected_mutual_info_fast.pyx
    Error compiling Cython file:
    ------------------------------------------------------------
    ...
    # cython: cdivision=True
    ^
    ------------------------------------------------------------

    sklearn/metrics/cluster/expected_mutual_info_fast.pyx:1:0: 'sklearn.metrics/cluster.expected_mutual_info_fast' is not a valid module name

Cython ファイル名でそのファイルのCコードを生成できるので、解凍して以下のコマンドでscikit-learnのインストールが成功しました。

cython scikit-learn-0.19.1/sklearn/metrics/cluster/expected_mutual_info_fast.pyx
pip install scikit-learn-0.19.1

scikit-learnの場合であれば、Python 3.7に対応したPyPIのパッケージがすぐに公開されるのでそれを待てばいいのですが、マイナーなパッケージの場合は対応に時間がかかる場合があるので、このことを知っれいればパッケージがインストルできないのでPython 3.6に戻すというケースを減らせると思います。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away