日々鍛錬

日本で一番?わかり易い??システムの落書き帳???を目指し????,日々鍛錬中な元SEさん主婦によるデベロッパとユーザと自分のための雑記帳

Windows におけるanaconda 仮想環境での読み込みエラー(解決)

意外なところで引っかかった.... 先日まで元気に動作して実行していた環境が突然,なんの前触れもなくエラーを吐き出したが解決

現象:

  1. anaonda で作成した仮想環境上でpandas, numpyが突如動かなくなる
    1. エラーの状況:
      >  import pandas as pd

      ModuleNotFoundError: No module named 'pandas'

      >  import numpy as np

      Original error was: DLL load failed while importing _multiarray_umath: 指定されたモジュールが見つかりません。'
      えーっと...確かに,先日,pandasを使ってcsvよみこんだり,dataframeを作成しましたよ...っと..orz

      また急になぜに??

    2. 最後に実行した仮想環境は何も変化していない
    3. また,当然だが,base環境も何も実行していない
    4. . だけど動かない...(´;ω;`)ウゥゥ

    環境を確認:(場所と仮想環境の名前などは適宜自分の環境で読み替える)

    インストール場所,platformの確認

    • OS: Windows 10 home
    • platform : win-64
    • anacondaの場所: C:\<anacondaインストール場所の親dir>\anaconda3
    • 仮想環境場所1: <anacondaの場所:>\envs\cvenv1
    • 仮想環境場所2: <anacondaの場所:>\envs\cvenv2

    以下より,commnad prompt (できるだけ,anaconda のPathが通る環境(ex: anaconda prompt, Anaconad powerShellが望ましい))

    anaconda Baseの環境

    Base の環境の確認は,現在の作業環境がbaseにいることを確認して,以下のコマンドで確認

    >conda info 
    - conda version : 4.10.3 - conda-build version : 3.21.4 - python version : 3.8.11.final.0

    anaconda 仮想環境(以下のコマンドから確認)

    > conda info -e 
    以下の出力が確認される(* : 現在の作業場所)
    # conda environments:
    #
    base                  *  <anacondaの場所:>
    cvenv1           <anacondaの場所:>\envs\cvenv1
    cvenv2           <anacondaの場所:>\envs\cvenv2
    ここでは,対象の場所を,cvenv1とする

    anaconda prompt上での環境の確認

    まずは以下のcommandで対象の仮想環境に移動

    > conda activate cvenv1
    この環境に,どのようなライブラリ,パッケージがインストールされているのかを確認
    >conda list
    問題のnumpyがインストールされていることが確認された...(´;ω;`)ウゥゥ おまけに,pandas もmatplotlibも...あともちろん,scipy, scikit-learnも... 当然よ,機械学習をここでガシガシ動かしていた... f:id:tomokop:20210915040511p:plain

    この時, - numpy :1.21.2 - pandas : 1.3.3 - jupyterlab : 3.1.7

    この段階で,[environment-kernels]は仮想環境でインストールされていないことを確認

    元のbaseの環境に戻る

    以下で,baseに戻る

    > conda deactivate
    ここでも,ライブラリ,パッケージのインストールを確認 - environment-kernels : 1.1.1 - numpy :1.20.3 - pandas : 1.3.2 - jupyterlab : 3.1.7

    もう一つの仮想環境(cvenvs2)内のライブラリなどを確認 - environment-kernels : なし - numpy :1.19.5 - pandas : 1.3.2 - jupyterlab : 3.1.7

    numpy, pandas,のインストール確認

    まずは,仮想環境2つ(cvenv1, cvenv2)とbase環境上でpandas, numpyが動くかをcommand prompt上で確認 以下はnumpyの場合として実行

    >python -c "import numpy as np; print(np.version); print(np.file);"
    > python -c "import pandas as pd; print(pd.version);print(pd.file);"
    これで,エラー吐き出しなしで各環境上にインストールしたバージョン番号が出力されているなら,numpy, pandasのインストールはOK 以下の吐き出しがそれぞれ確認される - 仮想環境1(cvenv1)
    1.21.2
    <cvenv1の場所>\lib\site-packages\numpy_init__.py
    - 仮想環境1(cvenv2)
    1.20.3
    <cvenv2の場所>\lib\site-packages\numpy_init.py
    - base
    1.19.5
     <anacondaの場所:>\lib\site-packages\numpy__init.py

    <重要>実際にjupyter lab (or notebook)を起動して,ライブラリの場所を確認

    実はここが肝でした. なんと,jupyterはデフォルトで,base環境のライブラリを読み込みます. 仮想環境からjupyter を起動したら,仮想環境にインストールされたライブラリやパッケージを読みに行きますが,baseで起動したjupyterはなんと,仮想環境をjupyter 上で切り替えてもbaseのsite-packageに引っ張られるという謎 実は今回のエラー解決はこの情報が大事

    これが,冒頭のエラーの掃き出しでした.

    そして,悲しいことに,私は,何度もここでpipやcondaでnumpy, pandasをインストールしてはアンインストールして,jupyer上で確認を繰り返ししました. しかし,一向に読み込むことはなかったです.

    謎...の沼,ってやつにハマりまくりました.

    でも,抜けてやる!の一心で,いろいろ探しまくります. 同じエラーがないか.など・・・

    以下などがヒットしました.

    仮想環境にenvironment_kernelsのインストール

    anacondaを使った仮想環境上のjupyterがmoduleをimportできない問題の解決 / jupyter上で環境を切り替える - 粗大メモ置き場

    このサイトを参考に実行,検証したのは,仮想環境1(cvenv1)の環境に,environment_kernelsのインストールを実行してみました.

    pip install environment_kernels
    しかし,jupyter上ではnumpy, pandasともに相変わらず何も読み込めない.. 関連サイトを検索すると,コマンドで「environment_kernels」,「environment-kernels」....

    いろんなサイトでハイフン(-), アンダースコア(_)がごっちゃ...

    どっちだよ...と泣きました... 

    こんな時は, pyplを信じ,以下を実行

    > pip install environment_kernels
    environment_kernels · PyPI

    ちなみに,,,「> pip install environment-kernels 」も実行できました....

    なんでだろう...(なぜ,インストールできたのか,これは分かりません,おまけにconda list にenvironment-kernelsとハイフンのバージョンがありました...)

    仮想環境にjupyterを入れてみる

    Anaconda の Jupyter Notebook で ModuleNotFoundError が発生した場合のトラブルシュート |

    仮想環境1(cvenv1)にjupyterの本体を入れてみる もともと,conda listで,「jupyter」がなかったので,以下を参考に入れてみる

    しかし,一向に変わらなかった jupyterとenvironment_kernelsは関係ないようだ

    mkl*.libの環境を環境変数として設定

    以下のメッセージを頼りに,numpyに注目して,環境を見直す

    Original error was: DLL load failed while importing _multiarray_umath: 指定されたモジュールが見つかりません。'

    IMPORTANT: PLEASE READ THIS FOR ADVICE ON HOW TO SOLVE THIS ISSUE!

    [https://numpy.org/doc/stable/user/troubleshooting-importerror.html:embed:cite]

    Importing the numpy c-extensions failed. This error can happen for different reasons, often due to issues with your setup.

    Path通ってないよ?いいの?と来たので,,, ということで,Windowsさまのユーザ変数環境にmkl関連のライブラリの場所をpathとして設定

    <anacondaの場所:>\Library\bin
    そして,,,,動かない.... orz(ぐずる)

    このpathの記述をもとに戻す..(環境変数から追加内容を削除)

    ほか,pyzmを入れ直せだとか,色々ありました.
    よく考えたら,そもそも,私はデフォルトのpathを壊さないようにしたい派です.
    だから,入れたことないものを入れ直せはちょっとよろしくない.

    じゃ,残りはJupyter そのものがおかしい,となるので,Jupyterそのものを見直すことに.

    jupyterそのもの設定を見る

    jupyterで何をどう読んでんのよ?となる. (あとから考えたら,こっちから先だったと後悔)

    まずはjupyterを各環境に入って,jupyterを起動させ,以下のコマンドを叩き込んでみる.

    import numpy as np
    import pandas as pd

    print(np.version); print(np.file); print(pd.version); print(pd.file);

    仮想環境1(cvenv1)

    1.21.2
    <仮想環境1のインストール場所>\lib\site-packages\numpy_init__.py
    1.3.3
    <仮想環境1のインストール場所>\lib\site-packages\pandas_init__.py

    仮想環境2(cvenv2)

    • environment_kernelなし
    • pandas, numpy の再インストールなし

    以下が出力

    1.19.5
    <仮想環境2のインストール場所>\lib\site-packages\numpy_init__.py
    1.3.2
    <仮想環境2のインストール場所>\lib\site-packages\pandas_init__.py

    base

    1.20.3
    <anacondaの場所>\lib\site-packages\numpy_init__.py
    1.3.2
    <anacondaの場所>\lib\site-packages\pandas_init__.py

    各仮想環境からの設定では問題なさそうとのことで,baseから仮想環境を切り替えて同じことを実行

    仮想環境1(cvenv1)

    エラーでnumpyが実行できない

    仮想環境2(cvenv2)

    1.20.3
    <anacondaの場所>\lib\site-packages\numpy_init__.py
    1.3.2
    <anacondaの場所>\lib\site-packages\pandas_init__.py

    ....おや?? これ,,,baseになっている...

    とのことで,以下をjupyter上で実行

    import sys
    import pprint

    pprint.pprint(sys.path)

    以下が出力

    ['<jupyterを読み込んだ場所>,
     '<仮想環境場所1>\python38.zip',
     '<仮想環境場所1>\DLLs',
     '<仮想環境場所1>\lib',
     '<仮想環境場所1>',
     '',
     '<仮想環境場所1>lib\site-packages',
     '<仮想環境場所1>lib\site-packages\win32',
     '<仮想環境場所1>\lib\site-packages\win32\lib',
     <仮想環境場所1>\lib\site-packages\Pythonwin',
     '<仮想環境場所1>\lib\site-packages\IPython\extensions',
     'C:¥User\Username\.ipython']

    問題ない.

    で,次が重要!

    !pip show numpy
    実行するとなんと!
    Name: numpy
    Version: 1.20.3
    Summary: NumPy is the fundamental package for array computing with Python.
    Home-page: https://www.numpy.org
    Author: Travis E. Oliphant et al.
    Author-email: None
    License: BSD
    Location: <span style="color: #d32f2f"><anacondaの場所>\lib\site-packages</span>
    Requires:
    Required-by: tifffile, tables, statsmodels, seaborn, scipy, scikit-learn, scikit-image, PyWavelets, pyerfa, patsy, pandas, numexpr, numba, mkl-random, mkl-fft, matplotlib, imageio, imagecodecs, h5py, Bottleneck, bokeh, bkcharts, astropy
    なんと,,,baseが読み込まれていることが発覚!

    では,環境がどうなっているのかというと,

    !conda info -e

    # conda environments:
    #
    base                  *  <anacondaの場所>
    cvenv1               <anacondaの場所>\envs\cvenv1
    cvenv2               <anacondaの場所>\envs\cvenv2

    上記からわかるように,base環境を読み込んでいた!

    これがまさに原因!

    いよいよ解決へ!

    これはjupyter側の仮想環境の読み込みの問題

    そして,jupyterをbaseで立ち上げる時,よく読むと,「c.EnvironmentKernelSpecManagerって,.env_dirs? もしかして,conda_env_dirsじゃないの?」な記述...

    ということで,C:/Users/username/.jupyter/jupyter_notebook_config.pyを開き,c.EnvironmentKernelSpecManagerをCtrl+fで検索し,対象箇所へ移動

    そして,以下として修正

    c.EnvironmentKernelSpecManager.env_dirs=['<anacondaのインストール場所>\envs\']

    c.EnvironmentKernelSpecManager.conda_env_dirs=['<anacondaのインストール場所>\envs\']

    Jupyterをbaseから起動しなおして,base上のjupyterで仮想環境をそれぞれ変更すると,仮想環境1.,仮想環境2がそれぞれ読み込まれていることを再確認

    例えば,仮想環境1なら

    Name: numpy
    Version: 1.21.2
    Summary: NumPy is the fundamental package for array computing with Python.
    Home-page: https://www.numpy.org
    Author: Travis E. Oliphant et al.
    Author-email: None
    License: BSD
    Location: <span style="color: #d32f2f"><仮想環境1cvenv1の場所>\lib\site-packages</span>
    Requires:
    Required-by: tifffile, tables, statsmodels, seaborn, scipy, scikit-learn, scikit-image, PyWavelets, pyerfa, patsy, pandas, numexpr, numba, mkl-random, mkl-fft, matplotlib, imageio, imagecodecs, h5py, Bottleneck, bokeh, bkcharts, astropy

    以上で完了~ さてさて,numpyの入れ直しに色々影響があったのが,matplotlib,pandas, seaborn, scikit-learn をpip で入れ直しました. これでもとの環境に戻りました.

    いろんなサイトを勉強したけど,あまりヒットする方法がなかったのです.

    Jupyterのサイトも回りましたが...

    ということで情報共有とします.

    ...無事解決したころは,,,,朝でして,今締め切りを心配している状態です.

    ただ..謎なのは,,,どうして,これまで実行できていたのでしょうか....

    ちょっとここらは分からないです. 強いていうなれば,...も今は思いつかないので,思い出したら追記します.

    ひとこと

    • 私がわからないだけだけど,jupyterさん,,,log吐きファイルってあるのかな.... 探したけど見つけられなかった...
    • ubuntu様,Mac様に置かれて,同じ問題を心配したが順調に動いていることを確認した.. なぜwindowsさまだけなのかなぁ...
    • できるだけ環境pathにオリジナル性は入れたくない
    • つくづく,windowsさまに私は嫌われていると実感
    • もしかして,先日Kinectのライブラリを入れなおしたこと,Visual studio 2019を入れたことが原因?と思ったりです...(それは嫌だが,濃厚になってきた...