Python 环境总结

Python Package Management

现状

以 Arch Linux 为例,默认的包管理器 pacman 基本取代了 pip 的生态位,将系统级 Python Package 纳入包管理,core repo 提供的 Python pip / setuptools 被设置为可选依赖(不默认安装)。

执行 sudo pip install [package]

Arch Linux
无法安装,Error:externally-managed-environment,建议使用 venv / pipx 并提示 PEP 668。

Ubuntu 22.04.3 on WSL2
正常安装,Warning:Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager.,建议使用虚拟环境。

Windows 11 23H2 22635.2915
正常安装

Arch Linux 禁用 pip 原因

滚动发行的特性要求系统由包管理器对所有组件进行统一更新(分析依赖关系,解决冲突,选择软件源,etc.),因此需要尽可能排除其他包管理器的影响。得益于 AUR 的生态建设,常见包都有收录(未收录也可以按照教程构建 PKGBUILD 文件)

Ex:

1
2
3
4
$ sudo pacman -S python-[package]
// Recommended, install in system dir /usr
$ sudo pip install [package]
// Should never be used (by default banned), will cause conflict with pacman
1
2
3
$ pip install --user [package]
// Optional if want to install user-wide package
// Need to deal with dependency

Ref:

Python - ArchWiki
Talk:Python - ArchWiki
System maintenance - ArchWiki
archlinux 的特点

Python Virtual Environment

A virtual environment is a directory into which some binaries and shell scripts are installed. The binaries include python for executing scripts and pip for installing other modules within the environment. There are also shell scripts (one for bash, csh, and fish) to activate the environment. Essentially, a virtual environment mimics a full system install of Python and all of the desired modules without interfering with any system on which the application might run.

省流:

包含 Python 可执行文件,包管理器,以及(控制环境激活状态的)脚本的隔离工作目录,不干扰系统状态 (某种意义上的无状态?)

venv / virtualenv

轻量化,提供基础的 Python 3 虚拟环境

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// Create using venv (integrated in Python 3.3+)
$ python -m venv [/path/to/envname]
$ python3.x -m venv [/path/to/envname]

// Create using virtualenv (available in python-virtualenv)
$ virtualenv [envname]

// Activate
$ source [/path/to/envname]/bin/activate

// Install a package
(same as pip)

// Deactivate
(envname) $ deactivate

// Delete
$ sudo rm -r [/path/to/envname]

实质上是对文件系统的管理

示例目录结构如下(使用 Python 3.8):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
.
├── bin
│   ├── activate
│   ├── activate.csh
│   ├── activate.fish
│   ├── Activate.ps1
│   ├── pip
│   ├── pip3
│   ├── pip3.8
│   ├── python -> python3.8
│   ├── python3 -> python3.8
│   └── python3.8 -> /usr/bin/python3.8
├── include
├── lib
│   └── python3.8
│   └── site-packages
├── lib64 -> lib
└── pyvenv.cfg

conda 文档

常见于Jupyter Notebook炼丹、科学计算等领域,默认使用 conda 处理内部依赖然而求解能力好像还不如 pip

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// Create env (Install miniconda/anaconda first)
$ conda create --name [envname] [package(=version)]

// Activate
$ conda activate [envname]

// Install a package
$ conda install [package(=version)]

// Deactivate
(envname) $ conda deactivate

// Delete
$ conda remove -n [envname] --all

pipx 文档

类似于系统包管理器,将 Python Package 作为独立应用程序管理(包括 Shell 支持等),因此适合管理基于 Python 的用户端应用程序。

In a way, it turns Python Package Index (PyPI) into a big app store for Python applications.

1
2
3
4
5
6
7
8
9
10
// Install a package (from PyPI or source control)
$ pipx install [package]
$ pipx install git+https://link/to/git/repo/[package].git@[branch/git hash]
$ pipx install https://link/to/archive/release.zip

// Inject a package (Add additional packages to an existing application installe)
$ pipx inject [app] [package]

// Run an app in a temporary virtual environment
$ pipx run [app] [args...]

poetry / pipenv 文档

目前 poetry 已经全面取代了 pipenv (Benchmark)
需要注意的是,poetry 是一个依赖管理&打包工具,必须安装在现有的隔离环境下,常与 pipx 配合使用方便开发 Python 应用 (Continuous Integration)

docker-python

都用 docker 了,不会自己写 docker-cli / docker-compose?

Ref:

Python/Virtual environment - Archwiki


Python 环境总结
https://definfo.github.io/2024/01/18/python-env/
作者
Sun Yuxuan
发布于
2024-01-18
许可协议