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