M1 MacでPython NLTKライブラリのImportErrorを解決する
はじめに
先日、M1 MacでPythonのNLTKライブラリ(Natural Language Toolkit)を使用しようとした際に、予期せぬImportErrorに直面しました。これは、異なるアーキテクチャ間での互換性の問題でした。
この記事では、問題の原因、解決策、そしてこの経験から得た教訓を共有します。
問題の原因
エラーは次のようなものでした。
ImportError: dlopen(...): tried: ... (mach-o file, but is an incompatible architecture (have 'x86_64', need 'arm64'))
通常、ImportErrorはPythonライブラリがインストールされていないことを意味します。
しかし、私のケースでは、NLTKはすでにインストールされていました。問題の根本的な原因は、M1 Macのarm64アーキテクチャと、以前のIntel x86_64アーキテクチャ間の不一致でした。
よく確認してみると、私のターミナルはRosettaモードで動作していたことがわかり、x86_64用のPythonとライブラリがインストールされていたのです。
アーキテクチャの違い(x86_64 vs arm64)
x86_64とarm64は、コンピュータのCPUアーキテクチャの違いを表します。
x86_64
- IntelとAMDが開発した64ビットのアーキテクチャ。
- 主にデスクトップPC、ラップトップ、サーバーで使用。IntelチップのMacもこれ。
arm64
- 低消費電力が特徴のモバイルデバイスや組み込みシステム向けアーキテクチャ。
- スマートフォンやタブレット、AppleのM1チップを含むデバイスで採用されています。
Rosettaとは
Rosettaは、M1(ARM64アーキテクチャ)のMacで、Intel(x86_64アーキテクチャ)のMac用に作られたソフトウェアを実行できるようにするエミュレーションレイヤーです。これにより、既存のx86_64アプリケーションがM1チップ上で動作できるようになります。
Rosettaモードでインストールしてしまっていた
重要な発見は、私のターミナルがずっとRosettaモードで動作していたことでした。おそらく、昔よく理解しないままRosettaモードをオンにした後、オフにするのを忘れてターミナルを使い続けていたようです。
これにより、以前にインストールしたPythonとその後のパッケージが全てx86_64用に設定されていたことがわかりました。
次のコマンドでターミナルのアーキテクチャを確認できます。
uname -m
結果がx86_64であれば、Rosettaモードで動作していることを意味し、arm64であれば、M1のネイティブモードで動作していることを意味しています。
解決方法
ターミナルのRosettaモードを切り替える
-
Finderを開く
-
Terminalを検索し、アプリ情報を開く: 右クリック(またはCtrlクリック)し、「情報を見る」を選択します。
-
Rosettaオプションの確認: 「情報」ウィンドウで、「Rosettaを使用して開く」のチェックボックスを探します。このオプションをオンにすると、そのアプリケーションはRosettaを介して開かれ、x86_64の命令がARMアーキテクチャに翻訳されます。オフすると、XXX。
-
変更を保存: チェックボックスの選択を変更したら、ウィンドウを閉じて変更を保存します。
-
ターミナルを再び開き、uname -mと入力してARM64モードになっていることを確認しました。
ARM64モードでのPythonの再インストール
HomebrewでPythonを再インストールする前に、HomebrewがARM64の設定であることを確認します。次のコマンドでHomebrewの設定を確認します。
brew config
CPU: の項目を確認し、arm64と記載されていればOKです。
次に、ARM64モードでPythonを再インストールしました。これにより、ARM64用のPythonがインストールされます。
brew install python
Pythonを再インストールした後、python3 --versionでバージョンを確認します。
python3 --version
pythonのアーキテクチャを確認するには、次のpythonコードを実行します。
import platform
print(platform.machine())
このコマンドは、システムのアーキテクチャタイプ(例えば 'x86_64', 'arm64' など)を返します。
'arm64'がprintされていれば、インストールしたPythonが'arm64'アーキテクチャであることが確認できました。
NLTKの再インストール
続いて、NLTKライブラリを再インストールしました。これにより、ARM64用の
ライブラリがインストールされます。
pip3 install nltk
テスト
Pythonスクリプトを再実行したところ、ImportErrorなしで正常に動作しました。これにより、NLTKが正しくインストールされていることが確認できました。
学んだこと
- アーキテクチャの違い: M1 Mac(arm64)と従来のIntel Mac(x86_64)でCPUのアーキテクチャに違いがあり、ソフトウェアの互換性に影響することを学びました。
- ソフトウェアをインストールする時の注意点: ソフトウェアをインストールするときには、正しいアーキテクチャ用のPythonとそのライブラリをインストールする必要性を理解しました。
- Rosettaの理解と注意点: 今回初めてRosettaの役割を理解しました。RosettaモードはFinderのチェックボックスで簡単に切り替えられますが、自分のターミナルが今どちらのアーキテクチャで動作しているのか、確認することが大切だと学びました。
Discussion