😱ImportError: cannot import name ~
# 問題
scipyからsignalがインポートできないぞ、と怒られました。具体的には以下。
from scipy import signal
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: cannot import name 'signal' from 'scipy' (/home/hoge/.local/lib/python3.7/site-packages/scipy/__init__.py)
# 調査
まずはぼくの環境について。Ubuntuです。
cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.4 LTS"
Pythonはanyenvのpyenvで入れた3.7.6です。以下、コマンド結果は一部省略しています。
pip show pip
Version: 20.1
Location: /home/hoge/.anyenv/envs/pyenv/versions/3.7.6/lib/python3.7/site-packages
pip show numpy
Version: 1.18.1
Location: /home/hoge/.anyenv/envs/pyenv/versions/3.7.6/lib/python3.7/site-packages
Required-by: scipy, pandas, opencv-python, matplotlib
pip show scipy
Version: 1.4.1
Location: /home/hoge/.anyenv/envs/pyenv/versions/3.7.6/lib/python3.7/site-packages
余談ですが、pip show にはホームページの情報などもあって便利です。
この時点で、pipでのscipyと、import時のscipy のパスが違います。
さらに、pythonのインタープリタで以下のように実行しました。
>>> import sys, pprint
>>> pprint.pprint(sys.path)
['',
'/home/hoge/.anyenv/envs/pyenv/versions/3.7.6/lib/python37.zip',
'/home/hoge/.anyenv/envs/pyenv/versions/3.7.6/lib/python3.7',
'/home/hoge/.anyenv/envs/pyenv/versions/3.7.6/lib/python3.7/lib-dynload',
'/home/hoge/.local/lib/python3.7/site-packages',
'/home/hoge/.anyenv/envs/pyenv/versions/3.7.6/lib/python3.7/site-packages']
この順番なので、まずは /home/hoge/.local/lib/python3.7/site-packages を見てみました。 /home/hoge/.local/lib/python3.7/site-packages にはscipyが入っていました。というか、scipyしか入ってません。え?いつ入れたんだろう。
ls -la で確認してみたところ、4月2日に入れたっぽい。なんとなく何かをした覚えはあるけど、具体的なことが思い出せない……。
# 解決
pip で他にも色んなものを入れてましたが、 /home/hoge/.local/lib/python3.7/site-packages はscipyしか入っていかったので、/home/hoge/.local/lib/python3.7 を消しました。
すると、from scipy import signal が無事怒られないようになりました!
焦った~。