如何控制pip
新创建的版本中使用的版本venv
?
默认情况下,它使用可能已过时或由于任何其他原因不适合的供应商 pip 分发。我希望能够创建一个初始venv
安装的用户指定版本的 pip ,而不是创建一个然后从环境中升级 pip 安装。
如何控制pip
新创建的版本中使用的版本venv
?
默认情况下,它使用可能已过时或由于任何其他原因不适合的供应商 pip 分发。我希望能够创建一个初始venv
安装的用户指定版本的 pip ,而不是创建一个然后从环境中升级 pip 安装。
对我来说,我只是在我的机器上升级了 pip/virtualenv/virtualenvwrapper(不在 virtualenv 内)。随后创建的 virtualenvs 具有更新的版本。
deactivate
pip install --upgrade pip virtualenv virtualenvwrapper
mkvirtualenv ...
通过阅读 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 中,它会寻找一个 wheel 文件(例如pip-*.whl
)而不是 a tar.gz
,但除此之外它的行为方式相同(感谢@wim 的更新)。
您不能使用 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
在 pip 19 中删除的内容。
更换安装在虚拟环境中的 pip 很容易。在您的虚拟环境中,只需执行以下命令:
pip install pip==1.4.1
venv
stdlib模块的新增功能是EnvBuilder.upgrade_dependencies
. 然而,它并没有venv
在 3.8.0 版本中及时进入命令行界面。
不幸的是,它不会真正帮助用户安装特定的pip 版本,只能安装最新版本。
一切都没有丢失!venv
CLI 确实提供了一个--without-pip
在这里有用的参数。您可以使用它来选择退出供应商 pip,然后实际使用供应商 pip 轮来安装所需的 pip 版本(以及在新创建的虚拟环境中可能需要的任何其他包)。这有点令人费解,所以最好把它放到一个 shell 函数中——这会进入你的 shell 配置文件或 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
}
正如所写,这个函数只是从索引中提取最新pip
的setuptools
、、和。wheel
要强制使用特定版本,您只需更改 shell 脚本的这一行:
.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
并且自 Python 2.7.9 以来--no-wheel
仍然有一个供应商提供的可用于引导的 pip 轮。Pathlib 将不可用,因此您需要将用法更改为+ 。pathlib
os.path
glob
TLDR
python -m pip install --upgrade pip==<target version number>
例子
在虚拟环境中从降级pip 20.3
到从降级。pip 19.3
(env) $ pip --version
pip 20.3.1
(env) $ python -m pip install --upgrade pip==19.3 # downgrading
Collecting pip==19.3
Using cached pip-19.3-py2.py3-none-any.whl (1.4 MB)
Installing collected packages: pip
Attempting uninstall: pip
Found existing installation: pip 20.3.1
Uninstalling pip-20.3.1:
Successfully uninstalled pip-20.3.1
Successfully installed pip-19.3
(env) $pip --version trex@Tobiahs-MacBook-Pro
pip 19.3