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_US
と UTF-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プログラムの command
に pipenv 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
はそのキャッシュを捨てるので、不正な結果が取り除かれます。