Blow Up by Black Swan

pythonスクリプトを実行しようとしたら”: Library not loaded”というエラーに遭遇した話

今回はエラー処理について記事を書きます。内容的にはかなり短いのですが、エラー原因の調査は時間がかかりやすく、またググっても解決策が中々見つからなかったり、古い解決策で逆に混沌の世界に迷い込んだりと、かなり浪費する作業だったりします。私も幾度となくそういった経験をしてきたので、エラー関係は些細なことでもできるだけ記事にし、少しでも多くの同じような経験の方に資するようにしていこうと心に決めています(心に決めてはいても中々実行できていませんが)。

そんなこんなで今回はpythonスクリプトを実行しようとした時に出会った”dyld: Library not loaded”というエラーをどのように解決したかについてまとめました。読んで頂いた方の参考になれば幸いです。

1. エラー内容とエラーが起こった状況

今回エラーが起こったのはPythonのプログラムを実行しようとした時です。実行したPythonスクリプトは、簡単なスクレイピングプログラムで毎日実行しているものです。このエラーに出くわす前日は問題なく動作していましたが、当日いきなり今回のエラーに出くわしびっくりしました。

Pythonプログラムの実行方法は仮想環境を起動後、python -mコマンドで実行する極めて一般的な方法です。仮想環境用のフォルダは”venv”で作成しています。具体的なコマンドとエラー内容は下記になります。

(venv)$ python -m <Python Project>
dyld: Library not loaded: /usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/Python
  Referenced from: /Users/hoge/Scraping/venv/bin/python
  Reason: image not found
Abort trap: 6

ちなみに実行環境はMacbookで、OSはMacOSXです。

2. エラーの原因

色々ググってみたところ、原因はvimのようでした。ちょうど前日の夜にvimをインストールしており、それがエラー原因となっているようです。具体的には一部ファイルを書き換えたようです。エラー発生状況を再度まとめると次のようになります。

n日  : Pythonスクリプト実行
       -> 成功
n日夜: vimインストール
       -> 一部のファイル書き換え
n+1日: Pythonスクリプト実行
       -> エラー発生

vimのインストールによって書き換えが起こっていたファイルはPythonファイルでした。具体的にはPythonが勝手にアップデートされており、それまで”3.7.0″となっていたディレクトリが、vimのインストールによって、”3.7.3″にアップデートされ、ディレクトリも書き換えられていました。

エラー前: /usr/local/Cellar/python/3.7.0
エラー時: /usr/local/Cellar/python/3.7.3

より厳密に言えば、仮想環境”venv”では未だ”3.7.0″をベースとしている一方、参照元のバージョンが”3.7.3″にアップデートされており、不一致が発生したということのようです。

3. エラーの解決策

このエラーを解消する方法は、仮想環境”venv”ファイルを再度作り直すだけでした。”venv”ディレクトリ一式を削除し、再度仮想環境を構築することで新しいPythonのバージョンに沿った環境が構築されます。必要なパッケージもインストールする必要があるので、その点は注意が必要です。

$ rm -r venv
$ virtualenv venv
$ . venv/bin/activate
(venv)$ pip install <packages>
(venv)$ python -m <Python Project>

私の場合、これでエラーが解消することができました。

4. 最後に

今回は、vimをインストールしたことにより発生したエラーについてまとめました。プログラミングを学習していると色々な場面でエラーに出くわしますが、ときにかなりの時間を使い、消耗することがあります。一方でそういった奈落の底に落とされたかのようなエラーが案外ちょっとしたことで解決したという経験をお持ちの方も多いのではないかと思います。私はエラーに出会った時は次の記事に書いていることを思い出すようにしています。

この記事では、バグやエラーと解決に要した時間について考察しており、バグやエラーの難易度とその解決に要した時間とは必ずしも比例するものではないと結論づけています。私も自身の経験則上、この結論には納得がいきます。そして、解決できないような場合には、集中力の欠如、注意力の欠如の状態にあると考え、一旦そのエラー対応をやめ、他のことをするように意識しています。意外にもこの対応もまた難しかったりするのですが(どうしても解決しようとしてしまう、人間の性か?)。。。笑

この記事がどなたかの参考になれば幸いです。読んで頂き、ありがとうございました。