🍎

M1 MacでPython NLTKライブラリのImportErrorを解決する

2024/01/22に公開

はじめに

先日、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モードを切り替える

  1. Finderを開く

  2. Terminalを検索し、アプリ情報を開く: 右クリック(またはCtrlクリック)し、「情報を見る」を選択します。

  3. Rosettaオプションの確認: 「情報」ウィンドウで、「Rosettaを使用して開く」のチェックボックスを探します。このオプションをオンにすると、そのアプリケーションはRosettaを介して開かれ、x86_64の命令がARMアーキテクチャに翻訳されます。オフすると、XXX。

  4. 変更を保存: チェックボックスの選択を変更したら、ウィンドウを閉じて変更を保存します。

  5. ターミナルを再び開き、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