1. はじめに
pipenvでPipfile.lockを生成するときに,無限に終わらない現象が僕にも起きた.そのとき試してダメだったこと,次善の策のまとめ.
2. 環境
- macOS Mojave 10.14.5
- pipenv, version 2018.11.26
3. Lockingが終わらない現象
ちなみに僕の場合librosaをinstallするところで起きた.
そのままだと大体
pexpect.exceptions.TIMEOUT: <pexpect.popen_spawn.PopenSpawn object at 0x10e008d90>
searcher: searcher_re:
0: re.compile('\n')
<pexpect.popen_spawn.PopenSpawn object at 0x10e008d90>
searcher: searcher_re:
0: re.compile('\n')
という感じでタイムアウトする.
もしくは,
$ pipenv install
Pipfile.lock (e35831) out of date, updating to (a55cbb)…
Locking [packages] dependencies…
このLockingが全く終わらない.
4. 試してダメだったこと
4.1. PIPENV_INSTALL_TIMEOUT, PIPENV_TIMEOUT の設定を長くする.
似たようなissueが大量に引っかかって,そこでこれで解決したと言われてた方法.
これでもダメだった.今回の僕の場合は長くしても終わらなかった.
4.2. 仮想環境のpythonのバージョンを下げる
もともと3.7.2でやってたが,installしようとしているpackageが3.6.8ではCIが通っていたので3.6.8に下げたがダメだった.
4.3. pipのversionを下げる.
調べてみるとpipenvのバージョンが2018.7.1ぐらいだった時代にpipのバージョンが新しすぎるとこの現象が起きていたらしい.
というわけで似たような感じかなと思って仮想環境内のpipのversionを19.2.1から18.1に下げた.ダメだった.
ちなみに18.0に下げてもダメだった.
5. うまくいった方法
5.1 pipを使う
pipenv shellで仮想環境内に入った後に,pip install hogeでインストールする.pipenv install hogeではなく.
なんのためのPipfileだというお気持ちになるのでオススメはしない.
5.2 Pipfile.lockを生成しない
PIPENV_SKIP_LOCK=trueの環境変数を定義しておくとPipfile.lockを生成しなくなる.
$ PIPENV_SKIP_LOCK=true pipenv install
buildしたマシンの情報やpythonモジュールのversionのハッシュ値などが保存されていて,Pipfileを変更した時に差分だけインストールして早くなるとか旨味があるのだろうが,動かないよりはマシなのでなくてもいいと割り切る.
Pipfile.lockを生成しない方法としては,環境変数を指定する以外にもpipenv install時のオプションが準備されている.(参考)
$ pipenv install --skip-lock
(これはコメントにて515hikaruさんに教えていただいたやり方です.感謝です.)
6. 終わりに
結論としてはlockしないという道しかなかったという事になる.