Pipenv覚書
Pipenvで躓いたこと便利なこといろんなことなどなど
pipenvでプロジェクトを初期作成しようとするとあらぬところにvenvフォルダが生成される.
(PIPENV_VENV_IN_PROJECT=1 は環境変数に設定済み)
> cd C:\Users\username\workspace\tmp
> pipenv --python 3.8
Successfully created virtual environment!
Virtualenv location: C:\Users\username\.venv
端的に言うと原因はC:\Users\username
の直下にPipfile
が存在していたから。
-
PIPENV_VENV_IN_PROJECT=1
が設定されているとPipenvはPipfileが置かれている場所をvenvのルートディレクトリにする - カレントディレクトリにPipfileがない場合Pipenvは
上位の階層のディレクトリを探しに行く
- Pipfileが上位の階層に見つからない場合はカレントディレクトリにvenvを作成する
-
C:\Users\username
にPipfileがあったのでそこをvenvルートと判断した
というわけ
windowsでこうなったけどおそらくwindows以外でも一緒
-
pipenv lock
でエラーする(v2020.8.13)pkg_resources.VersionConflict: (importlib-metadata 2.0.0 (/home/user/workspace/foo/bar/.venv/lib/python3.7/site-packages), Requirement.parse('importlib-metadata<2,>=0.12; python_version < "3.8"'))
- virtualenvのバージョンを上げると動いた
pip install -U virtualenv
- https://github.com/pypa/pipenv/issues/4476
Lambda向けに パッケージングする場合に、sync
でパッケージをインストールするフォルダを指定する方法
PIP_TARGET="<targetdir>" pipenv sync
プロジェクトフォルダ直下にパッケージをインストールしたい場合は"."を指定する
PIP_TARGET="." pipenv sync
参考: 【小ネタ】Lambda Layersのパッケージ作成に便利!!pipenvでsync対象ディレクトリを指定する方法
Powershellの場合bashのように実行時だけ有効な環境変数を指定することができないようなので、
あとで環境変数を削除する必要がある
> $env:PIP_TARGET = '<targetdir>'; pipenv sync
> Remove-Item Env:\PIP_TARGET
viertualenvが削除された状態(初期状態とかpipenv --rm
したあととか)にPIP_TARGET="<targetdir>" pipenv sync
するとpip install時に--prefix
オプションが勝手につくことがある。
pip installは--target
と--prefix
を同時に指定できない?のでinstallに失敗する。
(log的には--home
と--prefix
になってたけど--home
はついてなかったような・・・)
install対象が自前でsetuptoolsで定義したpackageだったけどそれ以外のルールはわからない。
seup.pyは引数無しのsetup()
のみでsetup.cfg
とpyproject.toml
に全部書いてた。
lock時に変にcacheが残っててうまく動作しないことがあるので--clear
オプションをつける
pipenv lock --clear -d
ただこれだと実行中のプロジェクト内のcacheしか消えないので、全体のcacheを消したい場合は以下
pipenv --clear
pipenvを任意のフォルダにインストールして使用する
pip install pipenv -t test_lib
PYTHONPATH=${WORKSPACE_DIR}/test_lib:$PYTHONPATH pytnon -m pipenv sync -d