mojimoji 0.0.10 での ImportError: DLL load failed ( Windows 10 64bit + Anaconda 環境 )

Windows 10 64bit の Anaconda 環境で mojimoji を使おうとしたときに遭遇した問題と解決法。

概要

経緯

カタカナの全角半角変換したかったので、速いらしい 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 を確認。

f:id:naga_sawa:20200420091056p:plain


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 でコンパイル済みバイナリが配布されるようになったので、出るようになったと。