Windows 10 64bit の Anaconda 環境で mojimoji を使おうとしたときに遭遇した問題と解決法。
概要
- Windows 10 64bit の Anaconda 環境で mojimoji 0.0.10 を pip install 後、 import 時に ImportError: DLL load failed が発生する。
- Win用 mojimoji モジュールの mojimoji.cp37-win_amd64.pyd が要求している VCRUNTIME140_1.DLL がロード可能パスに内のが発生要因。
- Visual Studio 2015、2017、および 2019 用 Visual C++ 再頒布可能パッケージ をインストールすると解消する。
経緯
カタカナの全角半角変換したかったので、速いらしい mojimoji を使ってみようとしたら、 conda リポジトリには mojimoji はないということなので、 pip でインストール。 もちろん conda と pip を混ぜるな危険(condaとpip:混ぜるな危険 - onoz000’s blog )は承知の上で。
> pip install mojimoji Collecting mojimoji Using cached mojimoji-0.0.10-cp37-cp37m-win_amd64.whl (35 kB) Installing collected packages: mojimoji Successfully installed mojimoji-0.0.10
そしておもむろに、
import mojimoji
すると、以下のようなエラーが。
Traceback (most recent call last): File "test.py", line 2, in <module> import mojimoji ImportError: DLL load failed: 指定されたモジュールが見つかりません。
「以前は使ったときは出なかったのになぁ」と思いつつ、ModuleNotFoundError ではないので、モジュールファイルそのものが実行環境から見えていると判断。
ImportError: DLL load failed は pyd なモジュールの読み込み時に、 pyd が参照している必要なファイルがない場合や、依存している DLL が見えてないといった、何かしらのロード時エラーが発生したことを意味してる。
一応インストール済みパッケージを確認。 → 大丈夫。
> conda list # packages in environment at C:\Users\yishi\Anaconda3\envs\make-train-text: # # Name Version Build Channel ca-certificates 2020.1.1 0 certifi 2020.4.5.1 py37_0 mojimoji 0.0.10 pypi_0 pypi
パッケージのインストール先である %USERPROFILE%\Anaconda3\envs\virtual_env\Lib\site-packages を確認すると、
mojimoji.cp37-win_amd64.pyd というファイルが入っている。
そのファイル名を変えると、インポート時のエラーが ModuleNotFoundError になるので、ptyhon からは見えてはいる。
ファイル破損の疑いもあるので、 https://pypi.org/project/mojimoji/0.0.10/#files から mojimoji-0.0.10-cp37-cp37m-win_amd64.whl をダウンロードして、拡張子を zip にして展開して出てきた同ファイルと比較したが正常。
となると mojimoji.cp37-win_amd64.pyd が参照している何かしらが問題を起こしている可能性が大きく、mojimoji には設定ファイルは無いので、参照している DLL が読めていないのか、参照している DLL 内でエラーになっているか。
と言うことで、 pyd が参照している DLL を Dependency Walkerで知らべる。
今は Dependencies というOSSになっている とのことなので、そちらを公式GitHubのリリースからダウンロードして展開。
perview.exe で拡張子を dll に変更した mojimoji.cp37-win_amd64.dll を読ませて、参照している DLL を確認。
Imports タブに一覧されている DLL があるか %USERPROFILE%\Anaconda3\envs\virtual_env 内の DLL をざっと見ていく。
api-ms-win-core*.dll はある。 python37.dll もある。 VCRUNTIME140.dll もある。
そして最後の VCRUNTIME140_1.DLL がない。ドライブ全体から VCRUNTIME140_1.DLL を検索しても見つからない。
ファイル名前から察するに、 VC++ のランタイムだと思われるので、ファイル名でググると2019年の後半になってから追加された DLL らしい。
となると最新の VC++ ランタイムを入れてやれば解決しそうなので、「Visual C++ 再頒布可能パッケージ」でググって以下のMS公式サイトより
https://support.microsoft.com/ja-jp/help/2977003/the-latest-supported-visual-c-downloads
「Visual Studio 2015、2017 および 2019」の x64: vc_redist.x64.exe をダウンロードしてインストールする。
そして再び import mojimoji するとエラーは出なくなりました。めでたしめでたし。
VCRUNTIME140_1.DLL は2019年の後半に入ってからx64環境向けに追加されたファイルのようなので、VS2019 環境でコンパイルされているx64バイナリ入りのモジュールで類似の問題にあたるやもしれない。
以前動いていたのは、mojimoji 0.0.9 で、パッケージが tar.gz 配布で手元コンパイルされてたので問題にならなかったもよう。
0.0.10 でコンパイル済みバイナリが配布されるようになったので、出るようになったと。