LoginSignup
5

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-07-07

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に戻すというケースを減らせると思います。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5