Pipenvでよく出喰わす問題

Pipenvはボランティアにより常に改善されていますが、現時点でも非常に幼いリソースの限られているプロジェクトで、対処する必要のあるゆがみもあります。 皆の援助が必要なのです (あなたの援助もです!)。

ここではPipenvを使っている人達が抱くことの多い疑問について解説します。 以下に書かれていることをよく読んで、あなたが遭遇している問題を解決できるかどうかを調べてください。

注釈

まず最初に、最新のPipenvが動いていることを確認してください!

☤ Your dependencies could not be resolved (依存関係が解決できない)

依存関係が 本当に 解決できることを確かめてください。 その確信が持てたのなら、依存関係解決のキャッシュをクリアする必要があるかもしれません。 次のコマンドを実行して:

pipenv lock --clear

再度試してみてください。

これで上手くいかない場合は、キャッシュディレクトリ全体を手作業で削除してみてください。 キャッシュディレクトリは通常は、次の場所のうちのどこかです:

  • ~/Library/Caches/pipenv (macOS)
  • %LOCALAPPDATA%\pipenv\pipenv\Cache (Windows)
  • ~/.cache/pipenv (それ以外のオペレーティングシステム)

Pipenvはデフォルトではプレリリース版 (例えば、alpha, betaなどの接尾語が 1.0b1 のように付いているバージョン) はインストールしません。 コマンドに --pre フラグを渡すか、次のような設定を

[pipenv]
allow_prereleases = true

Pipfileに書く必要があります。

☤ <モジュール名> というモジュールが無い

たいていはPipenvとシステムパッケージが混ざってしまっているのが原因です。 Pipenvは隔離された環境にインストールすることを 強く 推奨します。 既にインストールされているPipenvを全てアンインストールし、 ☤ Pipenvのインストール を参照して、推奨されている方法でPipenvをインストールしてください。

☤ pyenvでインストールしたPythonが見付からない

PYENV_ROOT が正しく設定されているか確認してください。 Pipenvは 3.6.4 やそれに類するバージョン名を持つCPythonディストリビューションのみサポートしています。

☤ PipenvがpyenvのglobalおよびlocalのPythonバージョンを考慮しない

Pipenvはデフォルトでは仮想環境を作成するのに使われたPythonを使います。 --python オプションを設定するか、もしくはインタプリタを選択するときに $PYENV_ROOT/shims/python を設定してpyenvを参照させられます。 より詳しいことは ☤ パッケージのバージョンを指定する を参照してください。

Pipenvが自動的に「ちゃんと動いて」欲しい場合は、環境変数 PIPENV_PYTHON$PYENV_ROOT/shims/python に設定して対応できます。 この設定によって、Pipenvは仮想環境を作成するために、デフォルトでpyenvのアクティブなPythonバージョンを使用します。

☤ ValueError: unknown locale: UTF-8 (未知のロケール: UTF-8)

macOSには、使っているシェルのエンコーディングを正しく判定できないというバグがあります。 また別のシステムでも、ロケール変数がエンコードの指定をしていない場合に問題になります。

ワークアラウンドは次の2つの環境変数に標準的なローカライズ形式を設定することです:

  • LC_ALL
  • LANG

Bashでは例えば、次の設定を ~/.bash_profile に追加できます:

export LC_ALL='en_US.UTF-8'
export LANG='en_US.UTF-8'

Zshでは、修正するファイルは ~/.zshrc です。

注釈

en_USUTF-8 の部分は両方とも、使用する言語とロケールおよびエンコーディングに変更できます。

☤ /bin/pip: No such file or directory (そのようなファイルまたはディレクトリはありません)

これはロケール設定が関係している可能性があります。 ☤ ValueError: unknown locale: UTF-8 (未知のロケール: UTF-8) を参照すると解決するかもしれません。

shell で仮想環境名がプロンプトに出ない

これは意図的なものです。 他のシェルプラグインを使ったり、 PS1 を設定するというより上手い方法を使って自力で実現できます。 どうしても仮想環境名を表示したければ、次のコマンドが使えます

pipenv shell -c

(ただしWindowsでは使えません)。

☤ Pipenvがsetup.pyにある依存関係を考慮しない

これは意図的に考慮していません。 Pipfileとsetup.pyはそれぞれ異なった目的にかなうもので、デフォルトではお互いを考慮しません。 より詳しいことは ☤ Pipfile vs setup.py を参照してください。

☤ supervisorプログラムで pipenv run を使う

supervisorプログラムの commandpipenv run ... を設定するときは、ローカル環境変数を適切に設定して、きちんと動くようにする必要があります。

次の行を /etc/supervisor/supervisord.conf[supervisord] セクションの下に追加してください:

[supervisord]
environment=LC_ALL='en_US.UTF-8',LANG='en_US.UTF-8'

Locking dependencies… となっている間に例外が送出される

pipenv lock --clear を実行してから、再度試してください。 ロック処理は、以後の実行を速くするために結果をキャッシュします。 バグがあってフォーマットが壊れてしまった場合、そのバグが修正された後でも、そのキャッシュに間違った結果が残っていることがあります。 --clear はそのキャッシュを捨てるので、不正な結果が取り除かれます。