V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
yazoox
V2EX  ›  Python

大家有没有比较好的经验,管理两个版本的 Python , 2 & 3?

  •  
  •   yazoox · 2022-05-12 08:45:35 +08:00 · 7828 次点击
    这是一个创建于 924 天前的主题,其中的信息可能已经有所发展或是发生改变。

    发现很多程序的运行环境,都需要 python 支持,而且,版本还不一样。python2 和 python3 都需要。

    楼主一直整得不太好(因为不是经常使用),经常一个程序或者环境跑起来,缺 python 。所以特意来请教一下,大家有没有比较好的 best practice ,管理 python 的版本,2 & 3 ,以及对应的 pip 。

    macOS 和 windows 都分别怎么设置,比较好用&通用?

    谢谢!

    第 1 条附言  ·  2022-05-12 09:27:55 +08:00
    补充一下,可能是我没有说清楚。

    我不是要在 python2 的多版本,或者 python2 & python3 之间切换。\
    而是需要多个 python 版本共存,同时生效。

    比如,安装 neovim ,他的设置里面就同时需要 2 和 3 两个版本的路径:\
    ```
    let g:python_host_prog = '/usr/bin/python'
    let g:python3_host_prog = '/usr/local/bin/python3'
    ```

    另,我们公司产品的开发环境里面,也需要 python2 的路径。

    等等
    70 条回复    2022-05-16 11:58:09 +08:00
    echo1937
        1
    echo1937  
       2022-05-12 08:47:40 +08:00   ❤️ 1
    如果是管理环境,miniconda + requirement.txt 是不错的,至于 Py2 我是真的不想写了,这比 Java8 还还牛皮癣。
    AJDX3906
        2
    AJDX3906  
       2022-05-12 08:48:43 +08:00 via Android
    anaconda 可以管理多个版本的 python
    tanwill12138
        3
    tanwill12138  
       2022-05-12 08:49:31 +08:00
    virtualenv
    duzhor
        4
    duzhor  
       2022-05-12 08:51:34 +08:00
    virtualenv +1
    crownor
        5
    crownor  
       2022-05-12 08:51:43 +08:00   ❤️ 2
    pyenv ,我感觉用起来是能够最透明的,一次设定后续一直有效,而且用起来和没有虚拟环境一样
    t2jk4000
        6
    t2jk4000  
       2022-05-12 08:52:50 +08:00
    pyenv
    zyiming1995
        7
    zyiming1995  
       2022-05-12 08:53:04 +08:00
    windows 下手动安装多个版本的 python, 然后在每个项目中使用 virtualenv 创建需要版本的虚拟环境; mac 和 linux 使用 pyenv
    Kinnice
        8
    Kinnice  
       2022-05-12 08:53:12 +08:00 via Android
    virtualenv
    或者
    直接 python 和 python3
    pip 使用时 python/3 -m pip
    Davic1
        9
    Davic1  
       2022-05-12 08:58:48 +08:00
    把环境变量改一下, 运行程序的名称也改一下, python2 就叫 python2 python3 就叫 python3 运行程序的时候直接 python2 xxx.py 或者 python3 xxx.py
    ffxrqyzby
        10
    ffxrqyzby  
       2022-05-12 08:59:40 +08:00
    pyenv 无烦恼
    huang119412
        11
    huang119412  
       2022-05-12 09:04:38 +08:00   ❤️ 1
    @echo1937 你是魔怔了还是生活不如意啊?说 Python 关 Java 什么事? Java 可没有抛弃向下兼容。
    rationa1cuzz
        12
    rationa1cuzz  
       2022-05-12 09:06:10 +08:00
    miniconda 或者 python 和 python3 pip 和 pip3 (如果只有两个版本的话)
    echo1937
        13
    echo1937  
       2022-05-12 09:06:22 +08:00   ❤️ 14
    @huang119412 #11 你才是魔怔了,我这两个都写,吐槽一下还需要你批准吗?
    raptor
        14
    raptor  
       2022-05-12 09:14:00 +08:00
    我以前是用 virtualevnwrapper ,后来不用 py2 了,现在用 pyenv ,不知道这个 py2 能不能用
    Fantasia1993
        15
    Fantasia1993  
       2022-05-12 09:15:49 +08:00
    Python 虚拟环境了解下
    Blunt1991
        16
    Blunt1991  
       2022-05-12 09:19:27 +08:00
    个人 pyenv 体验最好
    CrossEntropy
        17
    CrossEntropy  
       2022-05-12 09:23:40 +08:00
    个人体验上 anaconda/miniconda 作为 python 的版本管理工具、包管理工具很好用
    leonhao
        18
    leonhao  
       2022-05-12 09:24:39 +08:00   ❤️ 1
    2022 了,为啥还用 Python2
    chiu
        19
    chiu  
       2022-05-12 09:25:01 +08:00
    pyenv
    c8c
        20
    c8c  
       2022-05-12 09:25:26 +08:00
    pyenv
    palm0322
        21
    palm0322  
       2022-05-12 09:25:43 +08:00 via iPhone
    miniconda +1
    silkriver
        22
    silkriver  
       2022-05-12 09:27:10 +08:00
    pyenv 好像只适用于 *nix ,anaconda 是非 Python 程序员和非程序员的最佳选择
    yazoox
        23
    yazoox  
    OP
       2022-05-12 09:29:51 +08:00
    @leonhao 老项目维护。相信你也不愿意花大功夫,去给老的项目升级编译或者运行环境吧?(没有大的需求,或者变动情况下)
    yazoox
        24
    yazoox  
    OP
       2022-05-12 09:30:22 +08:00
    可能我没有说清楚,大家好像误会我的意思了。我再补充一点说明。
    谢谢
    exiledkingcc
        25
    exiledkingcc  
       2022-05-12 09:45:17 +08:00
    linux 的话,可以随便你安装多个 python ,然后用 python 虚拟环境不就行了。
    alanhe421
        26
    alanhe421  
       2022-05-12 09:46:09 +08:00
    1. 系统全局层面,alias 方式控制两个版本并存,比如 python 默认为 3 ,python2 即版本 2
    2. 单个项目层面,个人使用的 JB 的 IDE 直接抹平了这个版本环境问题,本身单个配置下运行环境
    ospider
        27
    ospider  
       2022-05-12 09:46:18 +08:00
    现在还需要 python2 的公司,建议直接辞职……
    Latin
        28
    Latin  
       2022-05-12 09:49:56 +08:00   ❤️ 1
    NOTE: You can activate multiple versions at the same time, including multiple versions of Python2 or Python3 simultaneously. This allows for parallel usage of Python2 and Python3, and is required with tools like tox. For example, to instruct Pyenv to first use your system Python and Python3 (which are e.g. 2.7.9 and 3.4.2) but also have Python 3.3.6, 3.2.1, and 2.5.2 available, you first pyenv install the missing versions, then set pyenv global system 3.3.6 3.2.1 2.5.2. Then you'll be able to invoke any of those versions with an appropriate pythonX or pythonX.Y name. You can also specify multiple versions in a .python-version file by hand, separated by newlines. Lines starting with a # are ignored.
    pyenv 正解
    https://github.com/pyenv/pyenv
    Oktfolio
        29
    Oktfolio  
       2022-05-12 09:52:10 +08:00
    我之前学 python 就是被这个环境管理劝退的
    mobbdeep
        30
    mobbdeep  
       2022-05-12 09:57:22 +08:00
    @ospider 开玩笑,很多赚钱的 py2 老项目跑着都很好,只要能一直赚钱,老板可不管你 2 还是 3
    BBCCBB
        31
    BBCCBB  
       2022-05-12 09:59:27 +08:00
    pyenv 好用...
    leonhao
        32
    leonhao  
       2022-05-12 09:59:28 +08:00
    @yazoox 如果老板同意我会升级,Python2 社区已经不维护了
    Donahue
        33
    Donahue  
       2022-05-12 09:59:50 +08:00
    同时生效也是用 virtual env 就能解决的,你设置路径的时候不要设置 /usr/bin/python , 而是设置成虚拟环境 python 就行了。比如 /virtual/env/path/python 。/usr/bin/python 是个 soft link, 在 activate 虚拟环境的时候指向对应虚拟环境的 python
    gesse
        34
    gesse  
       2022-05-12 10:00:15 +08:00
    virtualenv/pyvenv 利用已经安装的 python 版本虚拟出同一个版本的 python 环境,每个环境可以依赖不同版本的包。

    pyenv/anaconda/miniconda 安装不同的 python 版本,且共存

    pyenv-virtualenv 安装不同的 python 版本, 并且支持虚拟环境依赖不同版本的包

    我的理解是这样的,不知道是否有错误观点。
    ospider
        35
    ospider  
       2022-05-12 10:04:30 +08:00
    @mobbdeep 用 python2 多赚的钱又不分我,我找下份工作可是不需要 python2 这个技能了……
    liprais
        36
    liprais  
       2022-05-12 10:10:58 +08:00 via iPhone
    python2 已经 eol 了都不升级,赚来的钱是准备数据泄漏了交罚款么....
    fkdtz
        37
    fkdtz  
       2022-05-12 10:18:36 +08:00
    python 有很多包管理和环境管理工具,搞得人头大。
    但体验下来感觉还是 pyenv + virtualenv 最符合人类直觉,没有那么多花里胡哨。
    pyenv 管理 python 版本做到版本隔离,virtualenv 管理包环境做到项目隔离。
    bo233
        38
    bo233  
       2022-05-12 10:27:08 +08:00
    miniconda 还是挺好用的
    anxn
        39
    anxn  
       2022-05-12 10:28:30 +08:00
    linux 、mac:pyenv
    Windows:无
    liuxingdeyu
        40
    liuxingdeyu  
       2022-05-12 10:30:14 +08:00
    我觉得吧,pyenv+virtualenv 控制环境,py3 和 py2 之间用个进程间通信比如 rpc 啥的,多好
    ynyounuo
        41
    ynyounuo  
       2022-05-12 10:31:26 +08:00
    大家完全没有误会你的意思,而是你一直以来以系统 global 为所有项目和程序的 python2/3 依赖的 practice 是最坏的那种而已

    就以你举的 neovim 的例子,官方文档里也是推荐了 pyenv 的
    https://neovim.io/doc/user/provider.html#g:python3_host_prog

    其次比如说你是为了安装 glances 啊 youterm 之类的 global 可执行的东西而非为什么项目或程序做依赖,可以用 pipx ,当然依旧可以 pyenv + 自定义 path / link 来搞定
    Tink
        42
    Tink  
       2022-05-12 10:32:55 +08:00
    不影响啊,virtualenv 随便加,不管是 2 还是 3 ,你甚至可以同时应用 10 个不同小版本
    ThirdFlame
        43
    ThirdFlame  
       2022-05-12 10:33:24 +08:00
    miniconda 好用,环境独立,也可以复用。 也可以直接以某个虚拟环境进行执行。
    Tink
        44
    Tink  
       2022-05-12 10:42:18 +08:00
    举个例子,图里有 2.7 和 3.8 的应用,互不影响,也可以同时使用

    https://cdn.jsdelivr.net/gh/goxofy/piCS_assault@master/2022/05/upgit_20220512_1652323276.png
    princelai
        45
    princelai  
       2022-05-12 10:52:11 +08:00
    以前用 virtualenv ,现在换到 miniconda 了,太省事了,以前很多依赖、更新都是自己写脚本
    littlewing
        46
    littlewing  
       2022-05-12 11:02:36 +08:00
    conda
    Latin
        47
    Latin  
       2022-05-12 11:09:19 +08:00
    个人看法:pyenv + poetry 是目前最好方案
    FengMubai
        48
    FengMubai  
       2022-05-12 11:14:32 +08:00
    Windows 下用 scoop, `scoop reset python27`切换版本
    kukat
        49
    kukat  
       2022-05-12 11:35:11 +08:00
    以前用 pyenv 管理 python ,nvm 管理 node ,rbenv 管理 ruby...

    现在 asdf 一把唆 https://asdf-vm.com/
    ZztGqk
        50
    ZztGqk  
       2022-05-12 11:40:36 +08:00 via iPhone
    pyenv
    mantou99
        51
    mantou99  
       2022-05-12 12:02:20 +08:00 via Android
    安装 python 时通过源码编译安装,不要用 apt yum 之类的。
    编译前根据不同版本指定 比如--prefix=/usr/local/python3.7.5 ,--prefix=/usr/local/python3.9.1 。
    理论这样能装所有版本 python ,常用的搞个软连接 ln -s /usr/local/python3.7.5/bin/python3 /usr/bin/python3.7.5
    ln -s /usr/local/python3.7.5/bin/pip3 /usr/bin/pip3.7.5
    要删除的话直接删 /usr/local/python3.7.5
    lolizeppelin
        52
    lolizeppelin  
       2022-05-12 12:11:03 +08:00
    python2/3 在红帽 7 以后是共存的
    rpm 包名字都分 python2-和 python3-

    最靠谱的就是用系统包管理...

    因为用系统包管理所以不能用 pip 装任何 python 包,都要用 rpm 包来装,没有 rpm 包自己打包 rpm
    pythonm 的 rpm 包本身就是会基于 pip 编译,spec 文件里写好对应依赖就行

    要么系统全管...要么全自己管不走 rpm
    BingWong
        53
    BingWong  
       2022-05-12 14:46:18 +08:00
    可以使用 PDM 管理 python 版本和项目

    https://github.com/pdm-project/pdm
    SenLief
        54
    SenLief  
       2022-05-12 14:52:02 +08:00
    如果是多个版本共存的话,你重新命名就好了。软连接都可以。
    shuimugan
        55
    shuimugan  
       2022-05-12 16:30:26 +08:00
    没那么复杂,手工都能搞定,python 支持下载 zip 包的,一个目录放一个版本,python 二进制文件原地复制一个,再加到变量里,调用的时候指定具体版本 python 就可以了。
    以 windows 为例,下载不同版本的 zip 包 https://www.python.org/ftp/python/3.10.4/python-3.10.4-embed-amd64.zip ,解压保存
    c:/python/python3.10/python.exe 原地复制一个 python3.10.exe
    c:/python/python3.9/python.exe 原地复制一个 python3.9.exe
    c:/python/python3.8/python.exe 原地复制一个 python3.8.exe
    c:/python/python3.7/python.exe 原地复制一个 python3.7.exe

    至于 pip.exe 官方在 scripts 文件夹里面已经放好了一个 pip3.x 的了,就不需要做了。

    然后把
    c:/python/python3.10/
    c:/python/python3.9/
    c:/python/python3.8/
    c:/python/python3.7/
    追加到环境变量 path 里,然后就可以这样用
    pip3.10 install -r requirements.txt
    python3.10 1.py

    还可以结合 python3.x -m venv 给不同项目做一个依赖包的隔离

    这种方式起码可以 python/php/nodejs/ruby 上
    UN2758
        56
    UN2758  
       2022-05-12 17:38:27 +08:00
    miniconda + requirement.txt
    lvzb86
        57
    lvzb86  
       2022-05-12 17:38:44 +08:00
    pyenv ,对于文件夹路径的 python 版本进行管理
    zhangneww
        58
    zhangneww  
       2022-05-12 18:05:01 +08:00
    居然没人说 pipenv
    zhouu
        59
    zhouu  
       2022-05-12 18:09:36 +08:00
    asdf 一把唆 https://asdf-vm.com
    clf
        60
    clf  
       2022-05-12 18:09:38 +08:00
    版本 2 重命名为 python2 pip2 (或者是版本 3 的重命名为 python3 pip3 )简单粗暴。
    atttx123
        61
    atttx123  
       2022-05-12 19:47:14 +08:00 via iPhone
    pipenv ,一键到位
    AmberMmoe
        62
    AmberMmoe  
       2022-05-12 20:02:22 +08:00
    @atttx123 同意这个方案
    lasting
        63
    lasting  
       2022-05-12 21:08:18 +08:00
    Miniforge
    Richard14
        64
    Richard14  
       2022-05-12 22:22:30 +08:00
    @crownor 看了一下 pyenv 的项目说明,切换体验倒是很类似 conda ,他这个支持像 venv 一样每个项目单独创建一个环境吗?比如我想通过 supervisord 守护一个 py3.8 的项目,应该怎么指定版本是 3.8 呢
    PMR
        65
    PMR  
       2022-05-13 04:46:00 +08:00 via Android
    Windows



    py -2 xxx
    py -3 xxx
    coreki
        66
    coreki  
       2022-05-13 14:40:03 +08:00
    virtualenv,docker
    crownor
        67
    crownor  
       2022-05-13 17:48:13 +08:00
    @Richard14 支持单独创建环境的,比如直接用 pyenv virtualenv 3.8.1 venv_name 这个指令创建名字是 venv_name 的虚拟环境,然后你在当前项目下通过 pyenv local venv_name 就可以了,设置完成之后在当前路径及子路径下的体验就相当于原生 python 一样,完全不用管什么环境的事情了
    crownor
        68
    crownor  
       2022-05-13 17:51:54 +08:00
    @Richard14 使用 pyenv 还有一个优势是有很多其他语言的类似环境管理,比如 nodenv 等,基本上熟悉 pyenv 的操作那么其他类似的项目都能快速上手
    supersu
        69
    supersu  
       2022-05-13 21:23:21 +08:00 via Android
    @PMR 老哥这个是 win 的正解~
    julyclyde
        70
    julyclyde  
       2022-05-16 11:58:09 +08:00
    现在保留 python2 的程序已经是负担了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1197 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 23:09 · PVG 07:09 · LAX 15:09 · JFK 18:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.