pip installに成功したのに、読み込みに失敗するライブラリの解決方法


これなに?

pip installが成功しているにも関わらず、ライブラリとしてロードされないケースがあったので、その解決方法について。Amazon Linux AMIの問題みたいです。

環境

Amazon Lambdaの開発環境です。

  • Amazon EC2 Linux (AMI: Amazon Linux AMI 2018.03.0.20180508 x86_64 HVM)
  • Python 3.6.5
    • このAMIのプリインストールはPython 2.7なので、yumで追加installしています
  • VirtualEnv

症状

pip showしても、インストールしたライブラリが表示されない。
この状態で当該ライブラリをimportしようとするとModuleNotFoundError: No module named 'xxxx'となる。

インストール
$ pip --no-cache-dir install pyminizip
Collecting pyminizip
Installing collected packages: pyminizip
Successfully installed pyminizip-0.2.3
インストール結果の確認。認識されていない。
$ pip show pyminizip
$ 

解決策

ここに詳しく書かれているが、Amazon Linux AMIではpythonのライブラリの読込先(sys.path)として、/lib/だけが設定されてしまっている。
一方で、ライブラリによっては/lib64/にインストールされるものがあり、/lib64/を読込先として追加してあげないとダメだね、というオチ。

一時的なテストなら環境変数$PYTHONPATHに追加すればOK。永続的にこのライブラリを使うのであれば、.pthファイルを利用する。以下は、.pthを追加した場合。

.pthファイルの作成
$ echo /home/ec2-user/yourVirtualEnv/lib64/python3.6/dist-packages > /home/ec2-user/yourVirtualEnv/lib/python3.6/dist-packages/mypath.pth
$ cat mypath.pth
/home/ec2-user/yourVirtualEnv/lib64/python3.6/dist-packages
確認
$ pip show pyminizip
Name: pyminizip
Version: 0.2.3
Summary: A minizip wrapper - To create a password encrypted zip file in python.
Home-page: https://github.com/smihica/pyminizip
Author: Shin Aoyama
Author-email: [email protected]
License: UNKNOWN
Location: /home/ec2-user/encryptfile/lib64/python3.6/dist-packages
Requires:
Required-by:
$ 

参考にしたページ