有没有办法升级在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中存储构建的车轮。

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

其他回答

如何升级现有virtualenvwrapper项目的Python版本并保持相同的名称

我为任何使用Doug Hellmann的优秀virtualenvwrapper的人添加了一个答案,特别是因为现有的答案不适合我。

一些背景:

我从事的一些项目是Python 2,一些是Python 3;虽然我喜欢使用python3 -m venv,但它不支持Python 2环境 当我启动一个新项目时,我使用mkproject来创建虚拟环境,创建一个空的项目目录,并将cd放入其中 我想继续使用virtualenvwrapper的workon命令来激活任何项目,而不考虑Python版本

使用方法:

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

1. 禁用并删除旧的虚拟环境:

$ deactivate
$ rmvirtualenv foo

注意,如果你在钩子中添加了任何自定义命令(例如,bin/postactivate),你需要在删除环境之前保存这些命令。

2. 将真正的项目保存在临时目录中:

$ cd ..
$ mv foo foo-tmp

3.创建新的虚拟环境(和项目目录)并激活:

$ mkproject -p python3 foo

4. 将空的项目目录替换为真实的项目,更改回项目目录:

$ cd ..
$ mv -f foo-tmp foo
$ cdproject

5. 重新安装依赖项,确认新的Python版本等:

$ pip install -r requirements.txt
$ python --version

如果这是一个常见的用例,我会考虑打开一个PR来添加一些东西,比如$ upgradevirtualenv / $ upgradeproject到virtualenvwrapper。

这个方法对我来说总是有效的:

# 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

来自:

https://github.com/1st/python-on-osx#python-virtualenv https://gist.github.com/1st/ced02a1c64ac7b82bb27e432eea6b068

更新: 以下方法在较新的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

在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。测试它给出了一个错误。最后,我只是根据需求文件重新创建了环境。

I moved my home directory from one mac to another (Mountain Lion to Yosemite) and didn't realize about the broken virtualenv until I lost hold of the old laptop. I had the virtualenv point to Python 2.7 installed by brew and since Yosemite came with Python 2.7, I wanted to update my virtualenv to the system python. When I ran virtualenv on top of the existing directory, I was getting OSError: [Errno 17] File exists: '/Users/hdara/bin/python2.7/lib/python2.7/config' error. By trial and error, I worked around this issue by removing a few links and fixing up a few more manually. This is what I finally did (similar to what @Rockalite did, but simpler):

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

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