关于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之后, 直接新建虚拟环境以安装它:
|
使用
把所有python命令的python
字样替换为pypy3、pypy3.x、pypy3x
即可.
虚拟环境和包管理
Python开发中, 必不可少的是要做好版本管理,即在开发前要配置好包管理工具和虚拟环境管理工具, 可供选择的工具有pip
、venv
、virtualenv
、pipenv
、 conda
、mamba
、poetry
、Pixi
等.
工具比较
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环境, 但反过来不行 $$
下面将只关注pip
、conda
和poetry
等在不同系统环境下的安装使用.
pip
- 安装python: 进入python下载的官网, 按需选择
OS
和python3版本
, 根据提示下载并安装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 是一个强大且灵活的包和环境管理工具,其优势是:
- 多语言支持
- 跨平台一致性
- 数据科学和机器学习项目
- 复杂依赖管理
- 隔离项目环境
- 团队协作
有Anaconda
和Miniconda
之分, 后者是轻量级版本, 建议安装.
- 下面是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的完整功能.
- 官网下载, 双击安装
- 初始化: 进入
git-bash
, 把这段脚本添加到~/.bashrc
再重启shell即可. - 验证: 执行
conda --version
或conda info
配置
重要配置就是更换国内源, 但如果你系统内配置了代理
, 则不必换源.
进入~/.condarc
文件 (没有则创建) , 写入以下内容:
|
安装加配置-Linux下的自动化脚本
将下述命令保存为脚本文件并执行, 重载终端, 即可在抬头显示(base)
.
脚本内容
|
使用
如何进入环境
- Windows下:
- 打开powershell, 会自动进入
base
- 打开cmd, 需要执行
conda activate
以手动进入
- 打开powershell, 会自动进入
- 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 test1 ,conda deactivate |
列出所有环境 | conda env list |
删除指定环境 | conda remove -n *** --all |
导出/导入环境 | conda env export > environment.yaml ,conda env create -f environment.yaml |
从文件安装 | conda install --yes --file requirements.txt ,pip install -r requirments.txt |
安装时临时指定源 | conda install -c conda-forge -c bioconda package_name ,pip 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 ~/.bashrcwindows:
下载安装包, 双击后按引导即可.⚠️ 引导中的
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 init
和conda 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解释器)
创建项目
- 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
- init法 (对现有目录初始化):
配置(可选), 见
创建虚拟环境
⚠️ 前提: 合体场景就别使用创建功能了.
⚠️ 前提: 确保你已退出了其他的虚拟环境; 设置好poetry中关于虚拟环境的2个全局配置(virtualenvs.create
和virtualenvs.in-project
).自动创建方法:
当使用poetry install/shell/add/show
等命令时就可以自动创建.⚠️ 要开启
virtualenvs.create
配置, 自动方法才有效.手动创建方法: (可以指定python版本)
- 系统中已经有了你想要的python版本;
⚠️ 这里的
python版本
可以是其他虚拟环境中的python (e.g.conda的base
), 也可以是添加到了环境变量的python. - 在项目的
.toml
中对齐python版本号; poetry env use [python-name]
, python-name是你步骤2指定版本的python可执行文件名, 或绝对路径.- 验证:
poetry env info
, 里面有Virtualenv
和Base
两大模块.
- 系统中已经有了你想要的python版本;
进入虚拟环境
使用poetry shell
, 你的终端就在虚拟环境里了;
或者使用poetry run 'command'
, 可以不必进入虚拟环境, 却能使用虚拟环境.⚠️ 当虚拟环境无法进入, 即
poetry shell
失败:- 尝试
重启终端
; - 尝试手动激活: 找到虚拟环境目录下的
activate
文件, 执行source /path/to/current-venv/bin/activate
; - 再不济就用
poetry run
吧.
- 尝试
安装依赖:
- 法1, 用add最简单:
poetry add package_name
;add
的--group dev
, 依赖可分组, 这里把将要添加的模块放到开发组
. - 法2, 直接在
.toml
中手动指定依赖名及其版本号, 再用poetry lock
更新.lock
文件、再用poetry install
真正安装依赖.
- 法1, 用add最简单:
配置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
等命令.
合体方法
- 退出conda的激活环境
- 关闭poetry的创建虚拟环境功能:
poetry config virtualenvs.create false
, 以后poetry的run, shell, env
等命令也都别再使用了. - 在任意目录下创建个poetry的配置文件(pyproject.toml):
poetry init
如果你想让poetry的使用不再局限于某一个
项目目录
, 可直接在家目录
下进行初始化. - 创建一个conda环境并激活:
conda create -n myenv python=3.9
,conda activate myenv
poetry自动识别当前虚拟环境, 此时你可以用
poetry env info
查看当前环境信息了. - 自此, 你就可以在这个环境里愉快地使用poetry来管理依赖了:
poetry add/remove
等.
pixi
pixi是一个建立在 Conda 生态系统基础上的跨平台、多语言包管理器和工作流工具。
参考资料: 官网, github-repo, 命令手册, 从这里得知pixi
略… 来日再研究
hatch
Hatch 是一个现代化的 Python 项目管理工具,旨在简化和优化 Python 项目的管理和开发流程。它提供了从创建项目、管理依赖、构建和发布包到管理多环境的全方位支持。
其主要功能特点有: 项目创建和初始化; 依赖包管理; 多环境管理; 构建和发布; 插件系统; 集成工具…..
略… 来日再研究
相关工具
setup.py迁移到pyproject.toml
setup.py
是标准的和广泛采用的项目配置文件
, 但