在virtualenv中升级python

在virtualenv中升级python,python,version,virtualenv,pip,Python,Version,Virtualenv,Pip,有没有办法升级virtualenv中使用的python版本(例如,如果出现错误修复版本) 我可以pip freeze--local>requirements.txt,然后删除目录并pip install-r requirements.txt,但这需要大量重新安装大型库,例如我经常使用的numpy 我可以看出从升级时这是一个优势,例如2.6->2.7,但是2.7.x->2.7.y呢?你看到了吗?如果我没有误解这个答案,你可以尝试在旧的虚拟电视的基础上创建一个新的虚拟电视。您只需要知道哪个pytho

有没有办法升级virtualenv中使用的python版本(例如,如果出现错误修复版本)

我可以
pip freeze--local>requirements.txt
,然后删除目录并
pip install-r requirements.txt
,但这需要大量重新安装大型库,例如我经常使用的
numpy

我可以看出从升级时这是一个优势,例如2.6->2.7,但是2.7.x->2.7.y呢?

你看到了吗?如果我没有误解这个答案,你可以尝试在旧的虚拟电视的基础上创建一个新的虚拟电视。您只需要知道哪个python将使用您的virtualenv(您需要查看您的virtualenv版本)

如果您的virtualenv安装的python版本与旧版本相同,并且升级virtualenv软件包不是一个选项,那么您可能需要阅读以使用所需的python版本安装virtualenv

编辑

我已经测试过这种方法(在旧方法的基础上创建一个新的virtualenv),它对我来说很好。我认为如果从python2.6更改为2.7或2.7更改为3.x,可能会有一些问题,但是如果您只是在同一版本内升级(根据需要保持在2.7),您应该不会有任何问题,因为所有包都保存在两个python版本的相同文件夹中(2.7.x和2.7.y包在您的_env/lib/python2.7/)

如果更改virtualenv python版本,则需要重新安装该版本的所有软件包(或者只需将所需软件包链接到新版本软件包文件夹,即:您的_env/lib/python _newversion/site软件包)

再次更新: 以下方法在较新版本的virtualenv中可能不起作用。在尝试修改旧的virtualenv之前,应该将依赖项保存在需求文件(
pip freeze>requirements.txt
)中,并在其他地方对其进行备份。如果出现任何问题,您仍然可以创建一个新的virtualenv并在其中安装旧的依赖项(
pip install-r requirements.txt

更新:我在最初回答5个月后更改了答案。以下方法更方便、更稳健

副作用:它还修复了将Python升级到v2.7.8后在虚拟环境中导入ssl时出现的
符号未找到:_SSLv2_方法
异常

注意:目前,这仅适用于Python 2.7.x


如果您在OS X上使用自制Python,请首先
停用所有virtualenv,然后升级Python:

brew update && brew upgrade python
运行以下命令(
是虚拟环境的路径):


我无法在旧的虚拟电视上创建新的虚拟电视。但是,pip中有一些工具,可以更快地将需求重新安装到全新的venv中。Pip可以将requirements.txt中的每个项构建到一个控制盘包中,并将其存储在本地缓存中。当您创建一个新的venv并在其中运行pip安装时,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
malikarumi@Tetuoan2:~/Projects$ python3.6 -m venv {path to pre-existing dir you want venv in}
我安装控制盘(
pip install wheel
),然后运行
pip wheel-r requirements.txt
。这将在my pip.conf的wheel dir中存储构建的控制盘


从那时起,每当我pip安装这些需求中的任何一个时,它都会从轮子上安装它们,这非常快

我将我的主目录从一台mac移动到另一台mac(Mountain Lion到Yosemite),直到我失去了旧笔记本电脑,才意识到virtualenv坏了。我的virtualenv指向Python 2.7,由
brew
安装,由于Yosemite随Python 2.7提供,我想将我的virtualenv更新为Python系统。当我在现有目录上运行
virtualenv
时,我得到的是
OSError:[Errno 17]文件存在:'/Users/hdara/bin/python2.7/lib/python2.7/config'
error。通过反复试验,我解决了这个问题,删除了一些链接,并手动修复了一些链接。这就是我最后所做的(类似于@Rockalite所做的,但更简单):

cd
rm lib/python2.7/config
rm lib/python2.7/lib-dynload
rm包括/python2.7
rm.Python
cd-lib/python2.7
格芬德-l型-X型l |读取f;do ln-s-f/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/${f#./}$f;完成

在此之后,我可以在现有目录上运行virtualenv。

如果您碰巧使用的是Python 3.3+附带的venv模块,它支持一个
--upgrade
选项。 根据:

升级环境目录以使用此版本的Python,前提是Python已经升级到位

如何升级现有VirtualNewRapper项目的Python版本并保持相同的名称 我为任何使用Doug Hellmann的优秀答案的人添加了一个答案,因为现有的答案并不适合我

一些背景:

  • 我从事一些Python 2和Python 3项目;虽然我喜欢使用
    python3-mvenv
    ,但它不支持python2环境
  • 当我启动一个新项目时,我使用
    mkproject
    ,它创建虚拟环境,创建一个空项目目录,并将CD放入其中
  • 我想继续使用virtualenvwrapper的
    workon
    命令来激活任何项目,而不管Python版本如何
方向:

假设您现有的项目名为
foo
,当前正在运行python2(
mkproject-p python2 foo
),尽管从2.x升级到3.x、3.6.0升级到3.6.1等命令都是相同的。我还假设您当前在激活的虚拟环境中

一,。停用
brew install gettext && brew link gettext --force
[global]
download-cache = /Users/me/.pip/download-cache
find-links =
/Users/me/.pip/wheels/

[wheel]
wheel-dir = /Users/me/.pip/wheels
cd <virtualenv-root>
rm lib/python2.7/config
rm lib/python2.7/lib-dynload
rm include/python2.7
rm .Python
cd lib/python2.7
gfind . -type l -xtype l | while read f; do ln -s -f /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/${f#./} $f; done
python3 -m venv --upgrade ENV_DIR
$ deactivate
$ rmvirtualenv foo
$ cd ..
$ mv foo foo-tmp
$ mkproject -p python3 foo
$ cd ..
$ mv -f foo-tmp foo
$ cdproject
$ pip install -r requirements.txt
$ python --version
malikarumi@Tetuoan2:~/Projects$ python3.6 -m venv {path to pre-existing dir you want venv in}
brew upgrade python3
find ~/.virtualenvs/ -type l -delete
find ~/.virtualenvs/ -type d -mindepth 1 -maxdepth 1 -exec python3 -m venv --upgrade "{}" \;
$ pipenv --python 3.6.5 install
Virtualenv already exists!
Removing existing virtualenv…
Creating a v$ pipenv --python 3.6.5 install
Virtualenv already exists!
Removing existing virtualenv…
Creating a virtualenv for this project…
Using /usr/local/bin/python3.6m (3.6.5) to create virtualenv…
⠋Running virtualenv with interpreter /usr/local/bin/python3.6m
Using base prefix '/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6'
New python executable in /Users/dmoles/.local/share/virtualenvs/autoscale-aBUhewiD/bin/python3.6
Also creating executable in /Users/dmoles/.local/share/virtualenvs/autoscale-aBUhewiD/bin/python
Installing setuptools, pip, wheel...done.

Virtualenv location: /Users/dmoles/.local/share/virtualenvs/autoscale-aBUhewiD
Installing dependencies from Pipfile.lock (84dd0e)…
  For everyone with the problem

Error: Command '['/Users/me/Sites/site/venv3/bin/python3', '-Im', 'ensurepip', '--upgrade', '--default-pip']' returned non-zero exit status 1.

You have to install python3.6-venv

 sudo apt-get install python3.6-venv
# First of all, delete all broken links. Replace  my_project_name` to your virtual env name
find ~/.virtualenvs/my_project_name/ -type l -delete
# Then create new links to the current Python version
virtualenv ~/.virtualenvs/my_project_name/
# It's it. Just repeat for each virtualenv located in ~/.virtualenvs
pip freeze > requirements.txt
deactivate
mv env env_old
sudo apt-get install python3.7-venv
python3.7 -m venv env
source env/bin/activate
python --version
sudo apt-get install python3.7-dev
pip3 install -r requirements.txt
pip freeze > requirements.txt
deactivate
#Move the folder to a new one
mv venv venv_old
$ curl https://pyenv.run | bash
$ exec $SHELL
pyenv update
bash: pyenv: command not found
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
exec "$SHELL"
pyenv install 3.8.3
pyenv versions
python3.8 -m venv venv
source venv/bin/activate
pip install -r requirements.txt