• 发生时间:2022-04-26

  • 问题描述:

    • 目前新产品使用新代码库 A 进行 PCBA 测试,该代码库依赖 Python 3.8.10,因此我在 Windows 系统下安装了 Python 3.8.10。
    • 同时我也要维护旧代码库 B,该仓库依赖 Python 3.6.8,因此我又在 Windows 系统下安装 Python 3.6.8。
    • 这样带来一个问题:当我使用 python 命令时,它只能对应 Python 3.8.10 或者 Python 3.6.8,无法同时支持上述两个项目的开发。
  • 问题类别:软件维护

  • 原因分析:

    • 由于不同的项目需要使用的 Python 语言特性以及第三方库不一定不同,因此不同的项目使用的 Python 版本也不一定相同,这是正常现象。
    • 正如在 JavaScript 中,我们使用 npm 管理 nodejs 版本;在 Python 中,我们同样需要使用版本管理工具来管理 Python 版本。
    • 经过网上调查(stack overflow 1stack overflow 2),Python 版本管理工具有 venv、pyenv、virtualenv、virtualenvwrapper 和 anaconda 等。 (一位深度学习组的同事认为 anaconda 很好用,并且已经在他们组的服务器中广泛使用 anaconda。)
    • 当然,Python IDE 往往已经内置了一些 Python 版本管理工具以方便用户使用,比如 PyCharm 就内置了 virtualenv, Conda 和 Pipenv 等。
  • 解决方案:基于易用性和个人喜好的考虑,我最终选择了 virtualenv 工具来管理 Python 版本。(以下命令默认在 Git Bash 里执行)

    • 在默认的 Python 环境下,使用 pip install virtualenv 安装 virtualenv 工具。
    • 在仓库 A 和 B 的根目录下,分别使用 virtualenv -p <path-to-python.exe> venv 命令创建 Python 虚拟环境。
    • 在仓库 A 和 B 的根目录下,分别使用 source ./venv/Script/activate 命令进入 Python 虚拟环境。
    • 在 Python 虚拟环境中,使用 deactivate 命令即可退出虚拟环境。
    • 创建虚拟环境时,为方便填写 Python 路径,有个小技巧: 为每个 Python 可执行文件的路径创建一个环境变量,如 PYTHON36,在填写 Python 路径时直接写 $PYTHON36 就可以了。
  • 实施结果:使用 virtualenv 后,可以在不同项目中自由切换 Python 版本。

  • 经验总结:

    • virtualenv 安装简单、使用方便(只需记住3条命令),是 Python 版本管理的一个好工具。
    • 由于不同 Python 项目使用的 Python 版本不同,建议在各项目的 README 文档中明确声明所采用的 Python 版本。
    • 同理,requirements.txt 里面的第三方依赖库也应该注明其版本号。(可以使用 pip freeze 命令导出当前项目中第三方依赖库的名字及其版本号。)