关于python的解释器、包管理和虚拟环境环境等, 这里有你想要的.

接触python一段时间你会发现, 如果缺乏经验, 系统中多个python的版本冲突、不同项目对同一个依赖包的版本需求不一致等问题, 可能会产生未知的报错, 浪费你大量的时间. 另外python的运行效率有时也不尽人意……

为了提高生产力, 我们可以:

  • 选择更高性能的python解释器
  • 做好虚拟环境管理和包管理, 避免版本冲突

python解释器

Python是一种解释型语言,这意味着编写的代码需要通过解释器来读取和执行。

常见的解释器

  • CPython: 由 Python 的创始人及其团队开发. 是最广泛使用的、默认的 Python 解释器,支持所有标准库和第三方库. 是用 C语言编写的.

  • PyPy: 是一个高性能的Python解释器,采用Just-In-Time(JIT)编译技术,可以将Python代码动态编译为机器码。
    PyPy 通常比 CPython 运行更快,尤其是在计算密集型任务上。

  • JPython: 运行在 Java 虚拟机 (JVM) 上的 Python 解释器。可以无缝调用 Java 类和方法,适合与 Java 生态系统集成。

PyPy3

你是否需要它

  • 其优点: 更高的代码执行速度 (特别是计算密集型任务); 内存的优化; 对长时间运行的程序的友好…
  • 其局限: 在第三方库方面, 它在尽可能兼容 CPython, 但没有完全兼容!

或许你可以在特定项目中使用它, 比如在一个虚拟环境里安装使用它. 平时还是用默认的CPython.

安装

官方给出了多种方法, 这里建议conda法.
即在等你拥有了conda之后, 直接新建虚拟环境以安装它:

conda create -c conda-forge -n mypypy3 pypy python=3.9
conda activate mypypy3
conda install scipy # 例子

使用

把所有python命令的python字样替换为pypy3、pypy3.x、pypy3x即可.

虚拟环境和包管理

Python开发中, 必不可少的是要做好版本管理,即在开发前要配置好包管理工具和虚拟环境管理工具, 可供选择的工具有pipvenvvirtualenvpipenvcondamambapoetryPixi等.

工具比较

pip venv virtualenv pipenv conda mamba poetry Pixi
是pkg工具
能解决包冲突 × × × ×
是virenv工具
安装方法 内置 内置 pip安装 pip安装 下载 conda安装 pipx安装
其他 支持最广泛的包和库 比venv更强些 结合并简化了pip和virtualenv 强大, 支持多语言包 所有conda命令都可以被平替 强大, 统一了包、虚拟环境、项目的管理, python界的npm
优缺点 缺: 不支持pip的所有包 优: 是conda的改进和加速 缺: 无法主动下载python解释器; 和npm一样, 项目目录和虚拟环境无法解耦.

这些工具各有优缺点, 比如 Poetry 适合那些需要确保依赖一致性和隔离性的项目,而 Conda 则适合需要在多个项目之间共享环境的场景. 目前以我的观点来看, 可总结为:
$$一个conda环境可被多个项目使用;
\一个项目可有多个poetry环境, 但反过来不行 $$

下面将只关注pipcondapoetry等在不同系统环境下的安装使用.

pip

  • 安装python: 进入python下载的官网, 按需选择OSpython3版本, 根据提示下载并安装python的包. 完成后python内自带pip.
  • 配置: 在国内, 你可能需要更换pip源, 以期在执行pip install时有更快的下载速度.
    请进入~/.pip/pip.conf文件(没有则创建),写入以下内容, 按需删掉 (是不是注释) 你不需要的源:
    [global]
    index-url = https://pypi.org/simple/ # 官方源
    #index-url = https://pypi.tuna.tsinghua.edu.cn/simple # 清华源
    #index-url = https://mirrors.aliyun.com/pypi/simple/ # 阿里源

    注: 国内源有可能package未收录,这时候也要换回国外官方源,如:pip install -r requirements.txt -i https://pypi.org/simple/

conda-包和环境管理器

Conda 是一个强大且灵活的包和环境管理工具,其优势是:

  • 多语言支持
  • 跨平台一致性
  • 数据科学和机器学习项目
  • 复杂依赖管理
  • 隔离项目环境
  • 团队协作

AnacondaMiniconda之分, 后者是轻量级版本, 建议安装.

  • 下面是miniconda的安装与使用.
  • 如果你更愿意使用mamba来替代conda, 详见.
  • 值得说明的是, 最新版的 Conda已经集成了 libmamba 作为其求解器,就已经可以享受 libmamba 带来的性能提升了。

安装

Windows、Linux、MacOS
  • 可移步官网按需选择不同OS进行安装, 我这里只介绍Linux下清华镜像库中安装脚本的使用:

    mkdir ~/packages && cd ~/packages
    # 下载
    wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-latest-Linux-x86_64.sh
    # 脚本安装
    bash Miniconda3-latest-Linux-x86_64.sh -b -p ~/Miniconda3 # 用zsh可能有未知的错误,b是静默安装
    # 初始化
    conda init
    source ~/.bashrc
    # 验证
    conda -V

    这之后, 我们会在相应的shell的配置文件中(如~/.bashrc)看到类似下面的配置:

    # >>> conda initialize >>>
    # !! Contents within this block are managed by 'conda init' !!
    __conda_setup="$('/home/raymond/miniconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)"
    if [ $? -eq 0 ]; then
    eval "$__conda_setup"
    else
    if [ -f "/home/raymond/miniconda3/etc/profile.d/conda.sh" ]; then
    . "/home/raymond/miniconda3/etc/profile.d/conda.sh"
    else
    export PATH="/home/raymond/miniconda3/bin:$PATH"
    fi
    fi
    unset __conda_setup
    if [ -f "/home/ray/miniforge3/etc/profile.d/mamba.sh" ]; then
    . "/home/ray/miniforge3/etc/profile.d/mamba.sh"
    fi
    # <<< conda initialize <<<

    如果你想在新shell(e.g. zsh) 中也用上conda, 你需要将上述的脚本复制到新shell的配置文件(e.g. ~/.zshrc) 中, 其中'shell bash'换成'shell zsh'即可.

    这就成功安装了.

  • 如果是在Windows的OS中, 安装好后, 记得查看下conda安装目录及其下的./Scripts/是否已加入到你系统的$PATH中就好了.

win11-git-SDK

SDK是Windows下的仿Linux环境, 其终端是git-bash.
经过实践, 采用Linux的方式在git-bash中安装, 其安装过程、此后的使用过程, 都会有一些难以解决的小问题.

因此建议, 直接在Windows中进行可视化安装. 这样不仅CMD能用conda, git-bash也能通过Windows的$PATH变量, 获取到conda的完整功能.

  1. 官网下载, 双击安装
  2. 初始化: 进入git-bash, 把这段脚本添加到~/.bashrc再重启shell即可.
  3. 验证: 执行conda --versionconda info

配置

重要配置就是更换国内源, 但如果你系统内配置了代理, 则不必换源.

进入~/.condarc文件 (没有则创建) , 写入以下内容:

channels: 
- defaults
show_channel_urls: true
default_channels:
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
custom_channels:
conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
msys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
simpleitk: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud

安装加配置-Linux下的自动化脚本

将下述命令保存为脚本文件并执行, 重载终端, 即可在抬头显示(base).

脚本内容
# 安装. 可根据需求, 去tuna官网中查找合适的`file`(我这里用的是py3.9版本),或直接用最新版`Miniconda3-latest-Linux-$arch.sh`
arch=$(uname -m)
file="Miniconda3-py39_23.5.2-0-Linux-$arch.sh"
conda_dir="$HOME/Miniconda3"
wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/$file
echo "- - - - - miniconda-install.sh downloaded."
bash $file -b -p $conda_dir
rm $file
# 因为是静默安装,要手动初始化conda。
$conda_dir/bin/conda init
# 但其init命令无法识别shell,只会自动对bash初始化。而此时我们是在zsh里执行的上一步,还需将初始化脚本复制到.zshrc。
matched_content=$(awk '/# >>> conda initialize >>>/,/# <<< conda initialize <<<$/' ~/.bashrc)
modified_content=$(echo "$matched_content" | sed 's/shell\.bash/shell.zsh/')
echo "$modified_content" >> ~/.zshrc
# 更新终端后,你能看到(base)的抬头了
#source ~/.zshrc # 脚本执行的环境是bash,无法执行.zshrc

# 配置 conda的清华源
condarc_path=~/.condarc
if [ ! -f "$condarc_path" ]; then
touch "$condarc_path"
fi
cat <<EOL > "$condarc_path"
channels:
- defaults
show_channel_urls: true
default_channels:
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
custom_channels:
conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
msys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
simpleitk: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
EOL
echo "- - - - - miniconda3 is already installed."

使用

如何进入环境

  • Windows下:
    • 打开powershell, 会自动进入base
    • 打开cmd, 需要执行conda activate以手动进入
  • Linux下: 自动进入base
  • git-SDK下: 自动进入base, 如果没有, 则在git-bash.exe/bash.exe中执行source activate/deactivate以手动/退出进入环境

常用命令

conda创建环境 conda create -n test1 [--clone base] | [python=3.7] [other pkgs]
conda激活/灭活环境 conda activate test1conda deactivate
列出所有环境 conda env list
删除指定环境 conda remove -n *** --all
导出/导入环境 conda env export > environment.yamlconda env create -f environment.yaml
从文件安装 conda install --yes --file requirements.txtpip install -r requirments.txt
安装时临时指定源 conda install -c conda-forge -c bioconda package_namepip install package_name -i https://pypi.org/simple/

常用:

$

mamba-平替conda

Mamba (github-repo) 是一个由 Conda 社区开发的工具,用于改进和加速 Conda 的包管理和环境管理功能。它与 Conda 完全兼容,但在性能和用户体验方面进行了优化。

最新版的 Conda也已经集成了 libmamba 作为其求解器, 是否需要单独安装 Mamba就看你所需吧.

安装

☹️ 官方已不再建议在conda中安装的方式了: conda install mamba -n base -c conda-forge.

😉 官方推荐Miniforge安装的方式, 详见下面章节.

使用

与 Conda 的命令非常相似,只需将所有命令的conda字样替换为mamba即可.

miniforge

Miniforge是一种最小化的 Conda 分发工具 (就像miniconda),旨在为用户提供一个轻量级的 Conda 环境.

Miniforge拥有mamba支持, 且只以Conda-Forge作为默认频道.

安装

其安装脚本还有支持pypy3的可选项. 在GitHub-repo有详细的安装使用方法.

⚠️ 关于配置国内镜像源: 没必要!
经测试, 官方的conda-forge频道速度不慢的, 如果你想更快, 请直接在系统里配置代理, 无痛使用国外源.
⚠️ 关于channel配置: 保持默认, 不要修改!
即确保conda-forge是唯一的默认通道(用conda info命令查看), 不建议使用 Anaconda default channels.
⚠️ 关于虚拟环境: 不准使用base!
官方建议, base内不要安装任何东西, 请新建虚拟环境进行生产.

下面提供3种场景的安装总结:

  • Linux:

    # 这里选用带pypy3的安装脚本.
    curl -L -O "https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge-pypy3-$(uname)-$(uname -m).sh"
    bash Miniforge-pypy3-$(uname)-$(uname -m).sh
    # 然后进入交互式安装.
    # 安装完毕. 如果`miniforge`安装目录没在系统变量中, 请手动加入
    conda或mamba init
    source ~/.bashrc
  • windows:
    下载安装包, 双击后按引导即可.

    ⚠️ 引导中的Add Miniforge3 to my PATH environment variable不建议勾选, 因为会和其他软件存在潜在的冲突. 那么如何使用conda命令呢? 从开始菜单中的Miniforge Prompt中进入即可.

    你若还是想把miniforge的安装目录及其Scripts子目录加入Windows的系统变量PATH, 以便CMD/powershell使用, 这应该也可以, 我暂未发现什么问题.

  • git-SDK:
    sdk能读取到Windows的文件系统, 所以就在Windows中安装好即可.

    ❓ 但你会发现, 即使你把miniforge/miniforge/Scripts加入到git-SDK环境下的PATH, 你也无法在git-bash中正常使用conda initconda activate等命令.

    😉 解决办法: 直接把初始化代码粘贴在git-bash的shell配置文件中(即~/.bashrc), 重启shell即可. 注意修改代码中的”路径”和”shell.?sh”字样.

使用

像正常使用conda/mamba一样, 另外你刚安装好的pypy可随时使用.

poetry-包管理之神

poetry是python包管理、环境管理的唯一真神. 它能像js的npm一样管理python的项目、依赖包和环境. 同时其安装、使用、配置等都比较复杂, 学习成本稍微高些.

  • 相关资料: 入门指南; 官方教程; github-repo
  • 主要功能: 管理第三方模块的安装与卸载; 管理虚拟环境; 管理虚拟环境的依赖; 管理打包与发布.
  • 与conda的区别:
    • 包管理上:
      • 有更先进的依赖解析与管理;
      • 没有channel的概念, 默认下只从PyPI里下载包;
    • 环境管理上:
      • 在新建环境时, 无法自主下载指定版本的python解释器;
      • 不能脱离项目目录创造虚拟环境 (无法解耦环境与项目).
    • 项目管理上:
      如果你的项目有打包、分发、跨平台使用的需要, 建议老老实实享受poetry的各种便利, 不要搞合体

安装

有pip, pipx, 脚本(官方推荐)等安装方法, 可移步官网按需选择. 下面只介绍脚本方法.

  • WSL2、Linux、MacOS:
    curl -sSL https://install.python-poetry.org | python3 -
  • Windows:
    powershell中, (Invoke-WebRequest -Uri https://install.python-poetry.org -UseBasicParsing).Content | py -

注: 在Windows下, poetry命令的存放路径是C:\Users\***\.local\bin\; 在Linux下是~/.local/bin/.

  • win11-git-SDK:

    ~ 实践踩坑:

    • 报错场景: git-SDK环境内置了python3.11, 我在git-bash中执行了pipx的安装方式, 会产生一些无法解决的报错.
    • 报错原因: SDK环境下的MSYS2系统本身的问题, 具体未知.
    • 备注: 该报错场景需要进一步复现检验.

    ~ 解决方法1: 😐放弃git-SDK环境下自带的python解释器安装poetry的方法, 回头拥抱CMD/powerShell环境.
    ~ 解决方法2: 😊先安装conda, 然后退出conda-base虚拟环境, 再执行上pipx安装法.

    • 似乎不退出base虚拟环境也可执行pipx法, 以后验证下;
    • 暂不清楚方法2的有效的成因. 但要注意的是, 这种情况我们需要移步学习conda与poetry合体.

使用

  • 一个项目目录可以创建多个虚拟环境 (依托系统已有的多个python解释器)
  1. 创建项目

    • init法 (对现有目录初始化):
      cd target_dir; poetry init, 经过交互式问答, 最终得到pyproject.toml文件.
    • new法 (创建新目录):
      poetry new proj_name, 会自动创建一个proj_name目录, 其组织架构如下:
      proj_name
      ├── proj_name # 真正的项目目录
      │ └── __init__.py
      ├── pyproject.toml
      ├── README.md
      └── tests
      └── __init__.py
  2. 配置(可选),

  3. 创建虚拟环境

    ⚠️ 前提: 合体场景就别使用创建功能了.
    ⚠️ 前提: 确保你已退出了其他的虚拟环境; 设置好poetry中关于虚拟环境的2个全局配置(virtualenvs.createvirtualenvs.in-project ).

    1. 自动创建方法:
      当使用poetry install/shell/add/show等命令时就可以自动创建.

      ⚠️ 要开启virtualenvs.create配置, 自动方法才有效.

    2. 手动创建方法: (可以指定python版本)

      1. 系统中已经有了你想要的python版本;

        ⚠️ 这里的python版本可以是其他虚拟环境中的python (e.g. conda的base), 也可以是添加到了环境变量的python.

      2. 在项目的.toml中对齐python版本号;
      3. poetry env use [python-name], python-name是你步骤2指定版本的python可执行文件名, 或绝对路径.
      4. 验证: poetry env info, 里面有VirtualenvBase两大模块.
  4. 进入虚拟环境
    使用poetry shell, 你的终端就在虚拟环境里了;
    或者使用poetry run 'command', 可以不必进入虚拟环境, 却能使用虚拟环境.

    ⚠️ 当虚拟环境无法进入, 即poetry shell失败:

    • 尝试重启终端;
    • 尝试手动激活: 找到虚拟环境目录下的activate文件, 执行source /path/to/current-venv/bin/activate;
    • 再不济就用poetry run吧.
  5. 安装依赖:

    • 法1, 用add最简单: poetry add package_name;

      add--group dev, 依赖可分组, 这里把将要添加的模块放到开发组.

    • 法2, 直接在.toml中手动指定依赖名及其版本号, 再用poetry lock更新.lock文件、再用poetry install真正安装依赖.

配置poetry

  • 查看所有配置: poetry config --list

  • 开启/关闭虚拟环境的创建:
    conda+poetry场景下就关闭该功能.
    poetry config virtualenvs.create false

  • 把虚拟环境目录放在项目目录里:
    poetry config virtualenvs.in-project true,
    如果不进行该配置, 虚拟环境将默认集中存放于~\AppData\Local\pypoetry\Cache\virtualenvs(Windows)下, 或~/.cache/pypoetry/virtualenvs(Linux)下.

  • 配置多个源:

    只需在项目的pyproject.toml文件中添加如下代码:

    [[tool.poetry.source]]
    name = "tsinghua"
    url = "https://pypi.tuna.tsinghua.edu.cn/simple"
    priority = "primary"
    

    当然如果系统有代理, 就没必要配国内源了.

常用命令

poetry new proj_name 创建一个新项目
poetry add package_name 添加一个新的依赖. 它会同时完成.toml, .lock, 虚拟环境三者的更新.
poetry install [--no-root] - 安装所有依赖. 它会依照.lock文件来更新虚拟环境, 同时把当前项目作为一个本地package, 安装到当前虚拟环境的base环境site-packages中;

- no-root是只想安装依赖项而不安装当前项目, 适用于只有.toml文件没有具体项目的情况.
poetry show [-t] [pkg] 显示当前项目的依赖. -t是树形结构. pkg是显示特定的包
poetry update [pkg] 更新所有, 或指定的依赖
poetry remove package_name 移除一个依赖
poetry run python file.py 运行一个Python文件
poetry run command 在虚拟环境中运行命令
poetry shell 进入虚拟环境
poetry build 构建项目
poetry publish 发布项目
poetry config --list 查看配置
poetry config --unset key 删除配置
poetry config key value 设置配置
poetry search package_name 搜索包
poetry lock 锁定依赖 (常见于手动更新了.toml文件后)
poetry export -f requirements.txt -o requirements.txt 导出依赖到requirements.txt
poetry export -f requirements.txt --without-hashes -o requirements.txt 导出依赖到requirements.txt(不包含哈希值)
poetry env list [--full-path] 列出所有虚拟环境
poetry env remove env_name 删除虚拟环境
poetry env use env_name 创建、使用虚拟环境
poetry env info 显示虚拟环境信息
poetry env export -f requirements.txt -o requirements.txt 导出虚拟环境到requirements.txt

conda与poetry合体

当你想脱离项目目录, 直接像conda一样创建全局的虚拟环境时, 你会发现poetry竟然做不到! 所以好多人建议把他俩结合使用.

合体原理和规则

在一个项目目录里, poetry有两个工作: 维护.toml.lock文件进行包管理 (就像requirements.txt) ; 维护虚拟环境.

有趣的是, 当poetry没有/没被允许创建虚拟环境时, 它会主动使用当前的(虚拟)环境, 用poetry env info即可查看.

所以我们规定, conda只用于vir-env管理, poetry只用于包管理. 这种情况下应避免使用poetry run/shell等命令.

合体方法

  1. 退出conda的激活环境
  2. 关闭poetry的创建虚拟环境功能: poetry config virtualenvs.create false, 以后poetry的run, shell, env等命令也都别再使用了.
  3. 在任意目录下创建个poetry的配置文件(pyproject.toml): poetry init

    如果你想让poetry的使用不再局限于某一个项目目录, 可直接在家目录下进行初始化.

  4. 创建一个conda环境并激活: conda create -n myenv python=3.9, conda activate myenv

    poetry自动识别当前虚拟环境, 此时你可以用poetry env info查看当前环境信息了.

  5. 自此, 你就可以在这个环境里愉快地使用poetry来管理依赖了: poetry add/remove等.

pixi

pixi是一个建立在 Conda 生态系统基础上的跨平台、多语言包管理器和工作流工具。

参考资料: 官网, github-repo, 命令手册, 从这里得知pixi

略… 来日再研究

hatch

Hatch 是一个现代化的 Python 项目管理工具,旨在简化和优化 Python 项目的管理和开发流程。它提供了从创建项目、管理依赖、构建和发布包到管理多环境的全方位支持。

其主要功能特点有: 项目创建和初始化; 依赖包管理; 多环境管理; 构建和发布; 插件系统; 集成工具…..

官网, github-repo

略… 来日再研究

相关工具

setup.py迁移到pyproject.toml

setup.py是标准的和广泛采用的项目配置文件, 但


Static Badge Static Badge Static Badge Static Badge
Copyright © 2023-2024 Raymond H., All Rights Reserved.