有没有办法升级在virtualenv中使用的python版本(例如,如果bug修复版本出来了)?
我可以pip freeze——local > requirements.txt,然后删除该目录和pip install -r requirements.txt,但这需要大量重新安装大型库,例如numpy,我经常使用它。
我可以看到这是一个优势,当从,例如,2.6 -> 2.7升级,但2.7呢?X -> 2.7.y?
有没有办法升级在virtualenv中使用的python版本(例如,如果bug修复版本出来了)?
我可以pip freeze——local > requirements.txt,然后删除该目录和pip install -r requirements.txt,但这需要大量重新安装大型库,例如numpy,我经常使用它。
我可以看到这是一个优势,当从,例如,2.6 -> 2.7升级,但2.7呢?X -> 2.7.y?
当前回答
我不能在旧的virtualenv上创建一个新的virtualenv。但是pip中有一些工具可以更快地将需求重新安装到一个全新的venv中。Pip可以将requirements.txt中的每个项目构建到一个wheel包中,并将其存储在本地缓存中。当您创建一个新的venv并在其中运行pip install时,如果pip找到预构建的轮子,它将自动使用它们。轮子的安装比为每个模块运行setup.py要快得多。
我的~/.pip/pip.conf是这样的:
[global]
download-cache = /Users/me/.pip/download-cache
find-links =
/Users/me/.pip/wheels/
[wheel]
wheel-dir = /Users/me/.pip/wheels
我安装wheel (pip install wheel),然后运行pip wheel -r requirements.txt。这将在我的pip.conf的wheel-dir中存储构建的车轮。
从那时起,每当我安装这些需求中的任何一个,它都会从轮子上安装它们,这非常快。
其他回答
更新: 以下方法在较新的virtualenv版本中可能无法工作。在您尝试修改旧的virtualenv之前,您应该将依赖项保存在需求文件(pip freeze > requirements.txt)中,并在其他地方进行备份。如果出现任何问题,您仍然可以创建一个新的virtualenv并在其中安装旧的依赖项(pip install -r requirements.txt)。
更新:在我最初的答案5个月后我改变了答案。下面的方法更加方便和健壮。
副作用:它还修复了在将Python升级到v2.7.8后在虚拟环境中导入ssl时的Symbol not found: _SSLv2_method异常。
注意:目前,这是针对Python 2.7。x。
如果你在OS X上使用Homebrew Python,首先禁用所有virtualenv,然后升级Python:
brew update && brew upgrade python
执行以下命令(<EXISTING_ENV_PATH>为虚拟环境的路径):
cd <EXISTING_ENV_PATH>
rm .Python
rm bin/pip{,2,2.7}
rm bin/python{,2,2.7}
rm -r include/python2.7
rm lib/python2.7/*
rm -r lib/python2.7/distutils
rm lib/python2.7/site-packages/easy_install.*
rm -r lib/python2.7/site-packages/pip
rm -r lib/python2.7/site-packages/pip-*.dist-info
rm -r lib/python2.7/site-packages/setuptools
rm -r lib/python2.7/site-packages/setuptools-*.dist-info
最后,重新创建虚拟环境:
virtualenv <EXISTING_ENV_PATH>
通过这样做,旧的Python核心文件和标准库(加上setuptools和pip)将被删除,而安装在site-packages中的自定义库将被保留并在纯Python中工作。二进制库可能需要重新安装,也可能不需要重新安装才能正常工作。
在安装了Django的5个虚拟环境中,这对我来说是有效的。
顺便说一句,如果./manage.py编译消息之后不工作,试试这个:
brew install gettext && brew link gettext --force
让我们假设要更新的环境名为venv。
1. 备用venv要求(可选)
首先,备份虚拟环境的要求:
pip freeze > requirements.txt
deactivate
#Move the folder to a new one
mv venv venv_old
2. 安装Python
假设没有sudo访问权限,pyenv是一种可靠且快速的安装Python的方法。为此,一个人应该跑步
curl https://pyenv.run | bash
然后
exec $SHELL
正如这里所建议的。
如果,当有人试图更新pyenv
pyenv update
一个得到误差
bash: pyenv: command not found
这是因为pyenv路径没有导出到.bashrc。可以通过执行以下命令来解决:
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n eval "$(pyenv init -)"\nfi' >> ~/.bashrc
然后重新启动shell
exec "$SHELL"
现在你应该安装你想要的Python版本。假设是3.8.3版本
pyenv install 3.8.3
可以通过运行确认是否正确安装
pyenv versions
输出应该是位置和版本(在本例中是3.8.3)
3.创建新的虚拟环境
最后,安装了新的Python版本后,创建一个新的虚拟环境(我们称它为venv)
python3.8 -m venv venv
激活它
source venv/bin/activate
并安装需求
pip install -r requirements.txt
现在一个人应该在新的环境中开始工作了。
我不能在旧的virtualenv上创建一个新的virtualenv。但是pip中有一些工具可以更快地将需求重新安装到一个全新的venv中。Pip可以将requirements.txt中的每个项目构建到一个wheel包中,并将其存储在本地缓存中。当您创建一个新的venv并在其中运行pip install时,如果pip找到预构建的轮子,它将自动使用它们。轮子的安装比为每个模块运行setup.py要快得多。
我的~/.pip/pip.conf是这样的:
[global]
download-cache = /Users/me/.pip/download-cache
find-links =
/Users/me/.pip/wheels/
[wheel]
wheel-dir = /Users/me/.pip/wheels
我安装wheel (pip install wheel),然后运行pip wheel -r requirements.txt。这将在我的pip.conf的wheel-dir中存储构建的车轮。
从那时起,每当我安装这些需求中的任何一个,它都会从轮子上安装它们,这非常快。
步骤1:冻结要求并对现有环境进行备份
pip freeze > requirements.txt
deactivate
mv env env_old
步骤2:安装Python 3.7并激活虚拟环境
sudo apt-get install python3.7-venv
python3.7 -m venv env
source env/bin/activate
python --version
步骤3:安装需求
sudo apt-get install python3.7-dev
pip3 install -r requirements.txt
在OS X或macOS上使用Homebrew安装和升级Python3,我必须在python -m venv——upgrade ENV_DIR工作之前删除符号链接。
我在upgrade_python3.sh中保存了以下文件,这样我就能记住几个月后我需要再次这样做:
brew upgrade python3
find ~/.virtualenvs/ -type l -delete
find ~/.virtualenvs/ -type d -mindepth 1 -maxdepth 1 -exec python3 -m venv --upgrade "{}" \;
更新:虽然这似乎工作得很好,当我运行py。测试它给出了一个错误。最后,我只是根据需求文件重新创建了环境。