如何控制在新创建的virtualenv中使用的pip
版本?我相信我已经从操作系统中消除了所有其他版本的pip,但仍然mkvirtualenv从某个地方获得了一个pip-1.5!我希望它在virtualenv中使用pip 1.4.1。
$ which pip
/usr/local/bin/pip
$ pip --version
pip 1.4.1 from /usr/local/lib/python2.7/dist-packages/pip-1.4.1-py2.7.egg (python 2.7)
$ pip install virtualenv virtualenvwrapper
<snip...>
Successfully installed virtualenv virtualenvwrapper
Cleaning up...
$ source ~/.bashrc
$ mkvirtualenv spam
New python executable in spam/bin/python
Installing setuptools, pip...done.
(spam)$ which pip
/home/wim/.virtualenvs/spam/bin/pip
(spam)$ pip --version
pip 1.5 from /home/wim/.virtualenvs/spam/local/lib/python2.7/site-packages (python 2.7)
答案 0 :(得分:15)
对我来说,我刚刚在我的机器上升级了pip / virtualenv / virtualenvwrapper(不在virtualenv中)。随后创建的virtualenvs有更新版本。
deactivate
pip install --upgrade pip virtualenv virtualenvwrapper
mkvirtualenv ...
答案 1 :(得分:13)
从阅读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进行更新)。
答案 2 :(得分:4)
更换虚拟环境中安装的点很容易。在您的虚拟环境中,只需执行以下命令:
pip install pip==1.4.1
答案 3 :(得分:1)
您不能使用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
这将允许您继续使用在第19点中删除的--process-dependency-links
。
答案 4 :(得分:1)
stdlib venv
模块的新添加项是EnvBuilder.upgrade_dependencies
。但是,对于3.8.0版本,它并没有及时进入venv
命令行界面。
不幸的是,它并不能真正帮助用户安装特定于 的pip版本,只是最新版本。
一切都不会丢失! venv
CLI确实提供了一个--without-pip
参数,在这里很有用。您可以使用此选项退出供应商的pip,然后实际使用供应商的pip wheel来安装所需的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
和--no-wheel
中提供了类似的命令行选项,并且仍然存在可用来引导since Python 2.7.9的供应点子轮。 Pathlib将不可用,因此您需要将pathlib
的用法更改为os.path
+ glob
。
答案 5 :(得分:-1)
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