Open7

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のバージョンを上げると動いた
えんぶんえんぶん

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

https://stackoverflow.com/questions/1420719/powershell-setting-an-environment-variable-for-a-single-command-only

えんぶんえんぶん

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.cfgpyproject.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