现有的virtualenv可以优雅地升级吗?

124

我创建了一个Python 2.5的虚拟环境,现在想要将其“升级”到Python 2.6。

以下是初始设置方式:

virtualenv --no-site-packages -p python2.5 myenv

我现在在同一个目录中运行virtualenv来进行升级:

virtualenv --no-site-packages -p python2.6 myenv
...
Not overwriting existing python script myenv/bin/python (you must use myenv/bin/python2.6)
...
Overwriting myenv/bin/activate with new content

默认的Python版本仍然是2.5,即使我也可以指定使用2.6版本。有没有办法完全删除2.5,并将'bin/python'指向2.6?


4
2021年,我猜最好的方法就是创建一个新的虚拟环境并重新安装依赖项 - 其他一些SO答案(包括使用“upgrade”)可能不太适合。 - Anupam
相关类似问题:在虚拟环境中升级Python,该问题有关于在3.3及以后版本中升级补丁版本(例如从3.6.3升级到3.6.7或类似版本)的有用答案(对于功能版本的升级,除了保存需求并重新安装它们外,没有更好的解决方案)。 - undefined
6个回答

72

您可以使用Python 2.6的虚拟环境来“重新虚拟化”现有目录。不过,您需要重新安装您安装的所有模块。我经常为开发一个模块而创建一个虚拟目录,并在同一目录下使用多个版本的Python进行虚拟环境搭建,这很有效。


14
在重新使用Python 2.6运行虚拟环境之前,您可以直接移除虚拟环境中的bin/python可执行文件。请注意保持原意,同时让翻译更易于理解。 - Carl Meyer
10
可以让它工作-但为什么呢?virtualenv的主要吸引力在于它可以轻松且廉价地创建可重复的Python环境。为什么要去折腾一个不确定是否已经修复了所有问题、无法再次重现或者干扰生产环境的环境,而不是直接创建一个新的干净的环境呢? - Ned Deily
11
@Ned:Virtualenv不能创建可重复的环境,它只能创建隔离的环境。要想复制这些环境,您还需要以相同的方式安装所有内容,仅靠virtualenv是不够的。在这方面,zc.buildout更好。 - Lennart Regebro
1
@Ned: 理解了,这是我在工作中使用的开发环境。我想保持在2.5版本,除非绝对需要用到2.6版本。这个需求出现了,因此我想知道是否可以升级隔离环境以查看对代码的影响,而无需重建和复制/粘贴目录到新的环境中。 - Matt Norris
1
@emeraldhieu 只需重新运行 virtualenv,然后重新安装它所安装的软件包即可。 - Lennart Regebro
显示剩余6条评论

56

在Python 3.3+中,venv支持--upgrade标志。

  --upgrade             Upgrade the environment directory to use this version
                        of Python, assuming Python has been upgraded in-place.

使用方法:

python -m venv --upgrade YOUR_VENV_DIRECTORY

我刚刚将几个项目的虚拟环境从Python 3.7.x升级到3.8,没有遇到任何问题。


6
假设Python已经就地升级,这意味着如果我的系统中python3指向3.6版本,则我无法在我的虚拟环境中将python3指向3.7版本。 - joel
1
@joel我还没有尝试过,但是/path/to/user/python -m venv --upgrade会起作用吗? - ospider
我不确定这是否算作优雅的升级,因为它并没有处理旧的 site-package 目录中安装的软件包。因此,由于您仍然需要重新安装它们,与重新创建整个虚拟环境相比,并没有太多的优势... - maxschlepzig
2
想把我的venv从3.9迁移到3.11(django项目)。这个命令没有生成任何错误,但是在views.py中的print(sys.version)仍然显示为3.9.14。尝试使用python -m ... python3 -m ... python3.11 -m,结果相同。每次我都会停用+启用我的venv,但都没有成功。 - Abpostman1
嗯...文档上说:“自3.6版本起已弃用:pyvenv是推荐的工具...” - emeraldhieu

4

您需要使用python2.6创建一个新的virtualenv,然后在激活新环境后,使用它的python2.6easy_install安装所需的任何网站包的新版本。请注意,virtualenv的路径名被硬编码到环境中的各种文件中,因此,在准备切换到新环境时,要么更改启动脚本等以引用新的virtualenv路径,要么非常小心地将其复制到旧目录并修改其中的路径名。


4

您可以通过进入venv文件并从pyvenv.cfg更改Python路径及其版本来轻松完成此操作,方法如下:在此处输入图像描述


请将以下与计算机编程有关的内容从英语翻译成中文。请仅返回已翻译的文本:尽量不要粘贴图像,除非必要。答案中的详细说明应以文本形式输入。 - moken
虽然此链接可能回答了问题,但最好在此处包含答案的基本部分,并提供参考链接。如果链接的页面发生更改,则仅限链接的答案可能会失效。- [来自评论] (/review/late-answers/33500184) - コリン

2
在CentOS上安装第二个Python
  1. download python
  2. install to diff local

    configure --prefix=/opt/virtualenv/python 
    make && make install
    
  3. create virtual env using new python

    virtualenv /opt/virtualenv --python=/opt/python276/bin/python
    

    note: if needed it can be done with a different user

    chown pyuser -R /opt/virtualenv
    su - pyuser
    source /opt/virtualenv/bin/activate
    python -v
    
  4. Create virtual env:

    virtualenv /opt/virtualenv
    su - infograficos
    source bin/activate
    
  5. Install pip with python 2.7 (inside virtualenv)

    easy_install pip 
    

0
如果你使用的是OS X操作系统,想要升级Python到一个次版本(例如从2.7.6升级到2.7.8),同时保持第三方库的正常工作,可以尝试使用this
我在安装了Django的5个不同虚拟环境中成功使用了这种方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接