はじめに
先々月あたりの出来事なので少しうろ覚えですが、ブラウザ上でテキストファイルをアップロードしワードクラウドとワードツリーを作成するPythonアプリケーションの作成をしていた時に見たことがないエラーメッセージが出てきました。この記事はそれをどのように修復したかを今の忘れないうちにメモし、もし同じエラーに遭遇した人がいたらヒントになってくれたらと思い記録しました。
環境
- macOS Ventura 13.0 (Apple M1)
- Visual Studio Code 1.77.0
- Python 3.9.13
問題のエラー
とにかく、このPythonアプリケーションではFlaskを使用してウェブ上でテキストファイルをアプロードし、その後にまずワードクラウドのイメージを生成するのだが、こんなエラーメッセージが出てくる(ディレクトリーの一部を/....../にしてます)
Traceback (most recent call last):
File "/Users/...../app.py", line 2, in <module>
from wordcloud import WordCloud, STOPWORDS
File "/Users/....../site-packages/wordcloud/__init__.py", line 1, in <module>
from .wordcloud import (WordCloud, STOPWORDS, random_color_func,
File "/Users/....../site-packages/wordcloud/wordcloud.py", line 30, in <module>
from .query_integral_image import query_integral_image
ImportError: dlopen(/Users/....../site-packages/wordcloud/query_integral_image.cpython-310-darwin.so, 0x0002): tried: '/Users/....../site-packages/wordcloud/query_integral_image.cpython-310-darwin.so' (mach-o file, but is an incompatible architecture (have 'x86_64', need 'arm64')), '/System/Volumes/Preboot/Cryptexes/OS/Users/....../site-packages/wordcloud/query_integral_image.cpython-310-darwin.so' (no such file), '/Users/....../site-packages/wordcloud/query_integral_image.cpython-310-darwin.so' (mach-o file, but is an incompatible architecture (have 'x86_64', need 'arm64'))
今までも色々なPythonライブラリーを使用してきたのですが、このメッセージは初めてで、一見どのようにしたらよいのかわかりません...
とりあえずこのエラーはWordCloudライブラリの一部である「query_integral_image」モジュールのアーキテクチャの互換性に問題があるようです。ここでモジュールは別のアーキテクチャ (arm64) 用にコンパイルされたようですけど、システムは別のアーキテクチャ (x86_64) を使用してるようです。
ネットで調べてみるとPythonのscrapyとかRubyのcore_extとかを使用したときに同じエラーが起こったみたいな人を発見し、Pythonにおいてはライブラリーをアンインストールしてpipをアップデートしてもう一度ライブラリーを再インストールしたら直ったとの声を聞いたのでやってみたのですが私の場合は同じエラーがやっぱりどうしても出てきます。(普通に考えればアーキテクチャ互換性の問題と言っているのでそんな単純な方法で直るわけないです...)
解決法
そうこうしている間にやっと解決方法が見つかりました。以下をターミナルで実行したら直って無事にWord Cloudが表示されました。
(おそらく解決に一番役に立ったStack Overflowの質問と回答: https://stackoverflow.com/questions/71882029/mach-o-file-but-is-an-incompatible-architecture-have-arm64-need-x86-64-i)
ARCHFLAGS="-arch arm64" pip install wordcloud --compile --no-cache-dir
まず、ARCHFLAGS="-arch arm64"
は、ARCHFLAGS環境変数を設定して、インストールするパッケージのアーキテクチャタイプをM1チップで使用されるarm64に設定します。
次にpip install wordcloud --compile --no-cache-dir
で--compile
と--no-cache-dir
を使用してwordcloudをインストールします。--compile
は、見つかったソースファイルをコンパイルするように指示し、--no-cache-dir
はパッケージの保存にキャッシュディレクトリを使用しないように指示します。それによって、インストールが高速化され結果のパッケージのパフォーマンスが向上し、キャッシュに問題がある場合やパッケージの最新バージョンを確実にインストールしたい場合に役に立つとのことです。
まとめ
色々と調べてみたらM1チップを使っているとそこまで珍しい問題ではないようでした。
また、余談にはなりますが、ワードクラウドもワードツリーもPython Flaskを保ちつつ結局D3.jsと呼ばれるjsフレームワークでやったほうがブラウザ上で表示するためには便利だったのでpythonのライブラリではなくそっちに変更。この記事を書くのに渋った理由はそこにもあります。
そしてまた冷静に考えたらD3.jsでワードクラウドとワードツリーを表示するならPythonも必要ではないことにも気づきました。自然言語処理系なのでモダンなのはPythonかなと思い何も考えずにPython Flaskで開発をしていたのですが、そこに囚われなければ出会うことのないエラーでした。
同じエラーが起こった人がいればこの記事を参考にしてくだされば幸いです。
とにかく、このエラーのために時間を費やす必要はありませんでした...