2年前くらいに書いたAWS Lambda用のPythonスクリプトを修正することになったんですが、環境構築でひたすらハマったのでメモっておきます。
前提
問題1: pip installが上手く行かない
何か pip install xxx
でインストールしようとすると途中で permission denied エラーが出てインストールできません。
例えば pip install awscli
するとこんな感じで /bin/aws
に書き込みをしようとしてエラーになります
IOError: [Errno 1] Operation not permitted: '/bin/aws'
原因としては、いつ追加したか覚えてないんですが、setup.cfgというローカル固有の環境設定をするファイルが追加されてたようで(ref)、これに以下のように書かれてたのが原因でした.
[install] prefix=
Prefix, 自分の環境で言うと /usr/local
がこの設定により打ち消されていたようです、ファイルを消すことで解決。
問題2: Dockerのpythonのコンテナ上でライブラリが読み込めない
pip install xxx
したあとにxxxを使うスクリプトを python foo.py
で実行してもライブラリが読み込めませんでした。
公式の例に書かれてるように --no-cache-dir
を付けることで解決。
pip install --no-cache-dir xxx
問題3: バージョン固定が上手く行かない
requirements.txt を使って使うライブラリを指定してたんですが、2年経ってバージョンが上がってたため、最新用に色々修正しました。その後今のバージョンに固定しておこうかと思ったので、こんな感じで書いたんですが、、
foo==1.2.3 bar==4.5.6
この書き方ローカル開発中のIntelliJで上はちゃんと動いてたんですが、CircleCIで使うDockerの python:2.7
イメージ上で pip install -r requirements.txt
しても上手く必要なライブラリが全部インストールされませんでした。こちらのQiita記事を参考にして、バージョンは constraints.txt
は記述し、 pip install -r requirements.txt -c constraints.txt
とすることで解決。