有没有办法升级在virtualenv中使用的python版本(例如,如果bug修复版本出来了)?

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

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


当前回答

让我们假设要更新的环境名为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

现在一个人应该在新的环境中开始工作了。

其他回答

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

# 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

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。

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

如果您的virtualenv安装的python版本与旧版本相同,并且无法升级您的virtualenv包,您可能需要阅读这篇文章,以便使用您想要的python版本安装virtualenv。

EDIT

我已经测试过这种方法(在旧的virtualenv之上创建一个新的virtualenv),对我来说效果很好。我认为如果你把python 2.6改成2.7或者2.7改成3,你可能会遇到一些问题。X,但如果你只是在相同的版本中升级(保持在2.7),你应该不会有任何问题,因为所有的包都保存在两个python版本(2.7. X)的相同文件夹中。X和2.7。Y包在your_env/lib/python2.7/)中。

如果你改变了你的virtualenv python版本,你将需要重新安装该版本的所有包(或者只是将你需要的包链接到新版本的包文件夹中,即:your_env/lib/python_newversion/site-packages)

如何升级现有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。

如果你碰巧使用Python 3.3+附带的venv模块,它支持——upgrade选项。 根据文档:

升级环境目录以使用此版本的Python,假设Python已在适当位置升级

python3 -m venv --upgrade ENV_DIR