Python 3.7
が公開されたので早速使ってみたのですが、scikit-learn
をpip 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
に戻すというケースを減らせると思います。