web-dev-qa-db-ja.com

virtualenvでPIPバージョンを制御する

新しく作成された pip で使用されるvenvのバージョンをどのように制御しますか?

デフォルトでは ベンダーのpip分布 を使用しますが、これは他の理由で古くなっている、または不適切である可能性があります。ユーザー指定のバージョンのpipがインストールされたvenvを作成できるようにしたい最初に作成するのではなく、環境内からpipインストールをアップグレードします。

22
wim

Stdlib venv モジュールへの新しい追加は EnvBuilder.upgrade_dependencies です。ただし、それは3.8.0リリースに間に合うようにvenvコマンドラインインターフェイスに組み込まれませんでした。

残念ながら、これはユーザーが特定のpipバージョンをインストールするのを実際には助けません。最新のものだけです。

すべてが失われることはありません! venv CLIは、ここで役立つ--without-pip引数を提供します。これを使用してベンダーピップをオプトアウトし、実際にベンダーピップホイールを使用して目的のピップバージョンを(新しく作成した仮想環境で必要な他のパッケージとともに)インストールします。これは少し複雑なので、シェル関数に入れるのが最善です-これはシェルプロファイルまたはrcファイルに入れます。

function ve() {
    local py="python3"
    if [ ! -d ./.venv ]; then
        echo "creating venv..."
        if ! $py -m venv .venv --Prompt=$(basename $PWD) --without-pip; then
            echo "ERROR: Problem creating venv" >&2
            return 1
        else
            local whl=$($py -c "import pathlib, ensurepip; [whl] = pathlib.Path(ensurepip.__path__[0]).glob('_bundled/pip*.whl'); print(whl)")
            echo "boostrapping pip using $whl"
            .venv/bin/python $whl/pip install --upgrade pip setuptools wheel
            source .venv/bin/activate
        fi
    else
        source .venv/bin/activate
    fi
}

書かれているように、この関数は最新のpipsetuptools、およびwheelをインデックスからプルするだけです。特定のバージョンを強制するには、シェルスクリプトの次の行を変更します。

.venv/bin/python $whl/pip install --upgrade pip setuptools wheel

これに、例えば:

.venv/bin/python $whl/pip install pip==19.3.1

Python 2.7ユーザーの場合、virtualenv--no-pip--no-setuptools--no-wheelに同様のコマンドラインオプションを提供し、ベンダーのPIPホイールがまだ利用可能であるため、同様のトリックを実行できますto bootstrap since Python 2.7.9 。Pathlibは使用できないため、pathlib使用法をos.path + glob に変換します。

1
wim

私にとっては、自分のマシン(virtualenv内ではない)のpip/virtualenv/virtualenvwrapperをアップグレードしただけです。その後作成されたvirtualenvには更新されたバージョンがありました。

deactivate
pip install --upgrade pip virtualenv virtualenvwrapper
mkvirtualenv ...
15
KFunk

Virtualenvのソースを読み取ると、pipはvirtualenvに含まれているソースtarfileからインストールされているようです。 virtualenv 1.10.1ではpip-1.4.1.tar.gz の中に site-packages/virtualenv_supportディレクトリ(同じ場所からsetuptoolsを取得します)。バージョンを制御するために、そのアーカイブを適切に置き換えることができます。 virtualenv.py、少なくとも私が持っているバージョンは、どのバージョンのpipがそこにあるかを気にしません:

    if not no_pip:
        install_sdist('Pip', 'pip-*.tar.gz', py_executable, search_dirs)

--no-pipオプションを選択して、ソースから必要なバージョンをインストールします。

Virtualenv 1.11では、ホイールファイルを検索します(例:pip-*.whl)の代わりにtar.gz、ただしそれ以外は同じように動作します(@wimの更新に感謝します)。

14
Sam Hartsfield

仮想環境にインストールされたPIPを置き換えるのは簡単です。アクティブな仮想環境内で、次のコマンドを実行します。

pip install pip==1.4.1
4
Wolf

downgrade pipを使用してpipを実行することはできません。解決策は、仮想環境に特定のバージョンをインストールすることです。

virtualenv env -p python3.6 --no-pip
source env/bin/activate
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python get-pip.py pip==18.1

これにより、--process-dependency-linksピップ19で削除されました。

4
blueCat