有没有方法可以升级virtualenv中使用的python版本(例如,如果修补程序版本出来了)?在virtualenv中升级python
我可以pip freeze --local > requirements.txt
,然后删除目录和pip install -r requirements.txt
,但这需要很多重新安装大型库,例如numpy
,我用了很多。
我可以看到,从2.6 - > 2.7升级时,这是一个优势,但2.7.x - > 2.7.y怎么样?
有没有方法可以升级virtualenv中使用的python版本(例如,如果修补程序版本出来了)?在virtualenv中升级python
我可以pip freeze --local > requirements.txt
,然后删除目录和pip install -r requirements.txt
,但这需要很多重新安装大型库,例如numpy
,我用了很多。
我可以看到,从2.6 - > 2.7升级时,这是一个优势,但2.7.x - > 2.7.y怎么样?
您是否看到this?如果我没有误解这个答案,你可以试着在旧版本的基础上创建一个新的virtualenv。你只需要知道哪个python将使用你的virtualenv(你将需要看到你的virtualenv版本)。
如果您的virtualenv安装了旧版本的python版本,并且升级您的virtualenv软件包不是一个选项,您可能需要阅读this以便安装带有所需python版本的virtualenv。
编辑
我测试过这种方法(即在旧的上面创建一个新的virtualenv的一个),它为我工作得很好。我认为如果你从python 2.6变成2.7或2.7变成3.x,你可能会遇到一些问题,但如果你只是在相同版本内升级(如果你想要保持在2.7),你应该没有任何问题,因为所有的软件包都保存在两个python版本的相同文件夹中(2.7.x和2.7.y包在your_env/lib/python2.7 /内)。
如果你改变你的virtualenv python版本,你将需要为该版本再次安装所有的软件包(或者只需要将你需要的软件包链接到新版本软件包文件夹中,即:your_env/lib/python_newversion/site-packages )
如果可能的话,他特别不想重新安装任何软件包。显然,如果你不知道为什么它很重要,你从来没有从源代码安装numpy;)提示:它需要一个LOOOOOOOOOOOOOONG时间。 – 2012-06-16 20:16:55
是的,我明白这一点。但是,如果他在另一个之上制作虚拟技术,那么软件包不会丢失,所以他不必重新安装numpy或其他软件包。尽管如此,我认为他应该尝试这个新的虚拟世界以防万一失败。 – marianobianchi 2012-06-16 20:33:26
我休息我的情况,我相信新的virtualenv版本确实就地升级,但是对于旧版本,他们甚至没有覆盖蟒蛇可执行文件,造成的问题与至少一个python的修正版。 – 2012-06-17 09:42:27
再次更新: 以下方法可能无法在virtualenv中的较新版本。在尝试修改旧的virtualenv之前,您应该将依赖关系保存在需求文件(pip freeze > requirements.txt
)中并在其他地方对其进行备份。如果出现任何问题,您仍然可以创建一个新的virtualenv并在其中安装旧的依赖关系(pip install -r requirements.txt
)。
更新:我在最初回答5个月后更改了答案。以下方法更加方便和健壮。
副作用:还当你升级Python来v2.7.8之后在虚拟环境中做import ssl
修复Symbol not found: _SSLv2_method
例外。
注:目前,这就是Python 2.7.x仅。
如果您在OS X上使用自制的Python,第一deactivate
所有的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中,它们将被保留并运行。二进制库可能需要或可能不需要重新安装以正常运行。
这对我在5个安装了Django的虚拟环境中工作。
顺便说一句,如果./manage.py compilemessages
事后又没有工作,试试这个:
brew install gettext && brew link gettext --force
我必须删除的唯一文件是'bin/python'文件。 – 2016-09-26 22:21:52
对于某些旧版本的Python,删除'setuptools'和'pip'是必要的。 – Rockallite 2016-09-26 23:02:55
我也必须删除'
我没能在旧的上面创建一个新的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
我安装车轮(pip install wheel
),然后运行pip wheel -r requirements.txt
。这将构建的轮子存储在我的pip.conf中的wheel-dir中。
从那时起,任何时候我点子安装任何这些要求,它会从车轮安装它们,这很快。
因为我觉得利用PIP机器做的工作是有意义的大多数人,但人谁定制自己的virtualenvs postactivate,predeactivate等,这是不是一个理想的选项,因为所有的丢失,必须手动读取。 – dpwrussell 2016-04-18 17:26:43
我感动我的家目录从一个MAC到另一个(山狮优胜美地)并没有意识到对破碎的virtualenv直到我失去了旧笔记本电脑的保持。我有virtualenv中指向的brew
安装了Python 2.7,因为优山美地来与Python 2.7,我想更新我的virtualenv到系统蟒蛇。当我在现有目录之上运行virtualenv
时,出现OSError: [Errno 17] File exists: '/Users/hdara/bin/python2.7/lib/python2.7/config'
错误。通过试验和错误,我通过删除几个链接并手动修复了一些问题来解决此问题。这是我终于做到了(类似于@Rockalite做,但更简单):
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。
如果你碰巧使用Python自带3.3+的VENV模块,它支持--upgrade
选项。 每docs:
升级环境目录使用这个版本的Python,假设Python已经被升级就地
python3 -m venv --upgrade ENV_DIR
不幸的是,这在Ubuntu 16.04上不起作用,在那里他们打破了'venv'并拒绝修正它,因为“你可以使用virtualenv”。编辑:实际上,它确实工作!它也显示关于“ensurepip”的错误消息。 – rspeer 2017-05-18 20:01:43
我在我的系统上将python从3.5.1升级到3.6.4。在我的virtualenv上升级python,我不得不在命令中明确地提到python3.6:'python3.6 -m venv --upgrade
'--upgrade'标志在我的经验中是不必要的(3.5在Windows/Git Bash上为.2到3.5.4)。 – 2018-01-10 07:25:59
我为Doug Hellmann的优秀virtualenvwrapper专门添加了一个答案,因为现有的答案并不适合我。
一些背景:
python3 -m venv
,它不支持Python 2个的环境mkproject
它创建虚拟环境,创建一个空的项目目录,和CD进去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.更换所产生的空项目dir与实际项目,更改回项目目录:
$ cd ..
$ mv -f foo-tmp foo
$ cdproject
5.重新安装依赖关系,c onfirm新的Python版本,等:
$ pip install -r requirements.txt
$ python --version
如果这是一个常见的情况,我会考虑开一个公关添加类似$ upgradevirtualenv
/$ upgradeproject
到virtualenvwrapper。
我只是想澄清一下,因为一些答案指的是venv,其他指的是virtualenv。 virtualenv支持使用-p或--python标志,但不支持venv。如果你有多个Python版本,并且你想指定哪一个版本创建venv,可以在命令行上执行它,如下所示:malikarumi @ Tetuoan2:〜/ Projects $ python3.6 -m venv/path to pre-现有的要在
当然你也可以用VENV升级为其他人指出VENV目录,但假定您已经升级了用于创建摆在首位的是VENV Python的。你不能升级到你的系统上没有的Python版本,所以一定要获得你想要的版本,首先,然后制作你想要的所有venvs。
在OS X或使用自制软件安装和升级Python3我不得不删除符号链接之前python -m venv --upgrade ENV_DIR
会工作的MacOS。
我保存在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 .test它给出了一个错误。最后,我刚从需求文件重新创建环境。
尽管您可能可以修改某些路径等以使其起作用。你想要的最后一件事情是与生产环境略有不同。试想一下,如果各个版本的编译方式之间还有一个区别,那么通过跟踪这个错误,您将会节省所有时间。我只是花时间创建一个全新的virtualenv并重新安装一切。 – sdolan 2012-06-15 22:10:26
@Simon Walker。完全相同的问题。我必须升级python 3.5.3才能修正错误。 – 2017-07-19 09:54:51