0%

Python-模块管理

管理模块的模块。如:

  • importlib:【标准库】解释器所使用的导入机制的底层实现
    • zipimport:【标准库】从 zip 文件中导入模块或包。
  • pkgutil:标准库,便捷地访问资源文件的接口
  • pip首选 + 必备,安装和管理 Python 包的工具,从 PyPi 这一官方第三方模块仓库源里搜索、下载、安装。
    • Anaconda:一个基于 Python 的数据处理和科学计算平台,相当于数十个有用的常用的第三方库。全家桶,OUT
  • venv:【标准库】New in Python 3.3,标准库内置的虚拟环境管理工具,解决不同应用间多版本冲突。
    • virtualenv:Python 虚拟环境管理工具,已被 venv 挤下大佬位。OUT
  • pipreqs:扫描项目所使用的库,自动生成依赖清单(好像不太准的样子,没有安装的包也会检测出来)。
  • pipdeptree:显示当前环境下的 pip 依赖树

概述

最佳实践

  • pyproject.toml:项目的唯一配置入口
  • uv:项目的库管理
  • 虚拟环境:隔离项目依赖

pyproject.toml

1
2
3
4
5
6
7
8
9
10
[project]
name = "my_project"
version = "0.1.0"
dependencies = [
"flet>=0.85.2",
]

[build-system]
requires = ["setuptools", "wheel"]
build-backend = "setuptools.build_meta"

模块

  • Python 的 import 机制是由标准库的模块集合实现的。

虚拟环境

virtual environment:虚拟环境:一种采用协作式隔离的运行环境,允许 Python 用户和应用程序在安装和升级 Python 包时不会干扰到同一系统上运行的其他 Python 应用程序的行为。即同一系统下两个项目可使用不同的 Python 程序与 Python 包。

importlib

importlib:【标准库】解释器所使用的导入机制的底层实现

zipimport:【标准库】从 zip 文件中导入模块或包。

  • zipimport 常用来加载 Python EGG 文件或作为便捷的打包和分发应用的方式
  • importlib 常用于动态导入,用在插件或应用程序的扩展上
    • 代码热加载
1
2
3
4
5
6
7
8
9
10
11
12
import importlib
import my_module

# 一通操作,改了 my_module 外部配置、甚至改了 my_module 的源代码后
importlib.reload(os)


import importlib
def reload_module(module_name):
module = importlib.import_module(module_name)
importlib.reload(module)
return module

pkgutil

pkgutil:标准库,便捷地访问资源文件的接口

pip

#最佳实践

pip首选 + 必备,安装和管理 Python 包的工具,从 PyPi 这一官方第三方模块仓库源里搜索、下载、安装。

Anaconda:一个基于 Python 的数据处理和科学计算平台,相当于数十个有用的常用的第三方库。全家桶,OUT

  • 曾经看一个说法,大致是:Anaconda 解决了一些我本可以解决的问题,并引入了一些我不知道的问题。And pip 是官方正统,so, Anaconda, shit.

安装

1
2
# yay -S python38 时没有装上 pip,运行下面命令安装即可
python3.8 -m ensurepip --default-pip
  • 或者
1
2
下载: get-pip.py:https://bootstrap.pypa.io/get-pip.py
安装:./python.exe get-pip.py

优化

  • pip 安装太慢,换清华大学的源
1
2
3
4
5
6
7
8
9
10
# 清华源(当前首选)
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
# 豆瓣源(相对较快)
pip config set global.index-url https://pypi.douban.com/simple
# 阿里云源
pip config set global.index-url https://mirrors.aliyun.com/pypi/simple
# 腾讯云源
pip config set global.index-url https://mirrors.cloud.tencent.com/pypi/simple
# 华为源
pip config set global.index-url https://repo.huaweicloud.com/simple
1
2
# 上面的不行时,安装走这个
pip install -i https://pypi.douban.com/simple {module_name}

设置

1
2
3
4
5
6
7
8
9
# 多版本设置指定版本的 pip 为默认
pip -V # 查看当前版本

vi .bashrc

# 在最后添加
alias python=python3.8
alias pip="python3.8 -m pip"
alias py=python3

安装模块

正常来说:所有第三方的包都会被 pip 安装到 Python3 的 site-packages 目录下。

  • 标准库:
    • <module 'os' from '/usr/lib/python3.8/os.py'>
    • <module 'pip' from '/usr/lib/python3/dist-packages/pip/__init__.py'>
  • 第三方库:
    • <module 'torch' from '/home/user_name/.local/lib/python3.8/site-packages/torch/__init__.py'
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
pip install pkg [==version][>=version][<=version]
pip install pkg>=2.1.2

# 通过关键字搜索相关模块
pip search numpy

# 下载但不安装
pip download numpy1

# 从指定地方安装
pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple/

pip install flet[all]==0.25.0.dev3668 --upgrade


pip install --force-reinstall:在安装之前如果已安装,将先卸载它,与为包及每个依赖包运行pip uninstall -u dep && pip install dep几乎相同

pip install --ignore-installed: 忽略软件包及其依赖项是否已安装,覆盖已安装的文件(按需使用,尽量不用,不然可能会在sys.path中有老版本的模块,导入时可能会报错)

# 清空系统中的pip包的缓存
pip cache purge

# 强制安装,忽略依赖关系rr
pip install --no-dependencies package_name


pip install --no-index --no-dependencies -f ./ ultralytics-8.3.77-py3-none-any.whl

下载模块

1
2
3
4
pip download --platform anylinux_x86_64 # 指定平台信息
--no-depth on # on表示不下载依赖包
-d pkg_dir/ # 下载文件的目录
-r requirements.txt #

卸载模块

1
2
3
4
5
pip uninstall numpy

# 卸载所有模块
pip freeze>modules.txt
pip uninstall -r modules.txt -y

查看模块

1
2
3
4
5
6
pip list  # 查看当前安装
pip show flask # 查看指定模块信息
pip list --outdated # 待更新模块
# 更新包
pip install -U numpy
pip install --upgrade numpy

依赖文件

  • 用于记录所有依赖包及精确的版本号,以便在新环境里进行部署
  • requirements.txt 中不能带有中文,否则会报 UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 370: illegal multibyte sequence 错误
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
pipreqs ./ --encoding=utf-8

# 当前环境(虚拟环境 or 全环境)中依赖包及版本号生成
pip freeze > requirements.txt

# 安装依赖文件 requirements.txt 里的所有 Python 模块
pip install -r requirements.txt

# 确保当前环境软件包的版本(并不确保安装)
pip install -c constraints.txt
pip download --destination-directory /path_to_wheels -r requirements.txt

# 从/local/wheels 中查找包来安装
# /path_to_wheels用绝对路径,之前用相对路径有报过找不到对应whl的q
pip install --no-index --find-links=/path_to_wheels -r requirements.txt
# -d /data/pkgs/

遇到的问题


  • 问题:pip3 install –no-index –find-links= Url ‘./Test/flask’ is ignored. It is either a non-existing path or lacks a specific scheme.
  • 解决方案:
    • os.system 来运行这个有问题,需要换成绝对路径
    • WARNING: The script streamlit is installed in '/home/user_name/.local/bin' which is not on PATH. Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.

  • 问题:Ubuntu 24.04,在使用 pip 时,报 error: externally-managed-environment
  • 解决方案:
1
2
3
4
cd /usr/lib/python3.12
sudo rm EXTERNALLY-MANAGED
# 需要恢复时:
sudo touch EXTERNALLY-MANAGED

conda

conda:Miniconda 与 Anaconda 的核心都是 Conda。它集成了软件包管理和环境管理

  • 软件包管理:软件包下载安装、升级、依赖管理等
  • 环境管理:创建不同的虚拟环境,安装不同版本的包且互不干扰

配置清华源

1
2
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --set show_channel_urls yes
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 创建环境
conda create -n env_name
# 激活
conda activate env_name
# 退出
conda deactivate
# 删除已有环境
conda remove -n env_name --all
# 查看已有环境
conda info -e
# 安装/删除包
conda install pkg_name
conda remove -n env_name pkg_name
# 查看安装的包
conda list

遇到的问题

  • 问题:终端默认进入 conda 的 base 环境
  • 解决方法:
1
2
3
4
# 修改配置
conda config --set auto_activate_base false
# 查看配置
conda config --show

venv

venv:【标准库】New in Python 3.3,标准库内置的虚拟环境管理工具,解决不同应用间多版本冲突。

virtualenv:Python 虚拟环境管理工具,已被 venv 挤下大佬位。OUT
pipenv:曾经不错的包管理工具,作者貌似已弃坑,OUT
yolk:第三方库多版本选择,Python2 的,断更于 2012 年,OUT

  • 一个 Python 安装可能无法满足每个应用程序的要求。如果应用程序 A 需要特定模块的 1.0 版本但应用程序 B 需要 2.0 版本,则需求存在冲突,安装版本 1.0 或 2.0 将导致某一个应用程序无法运行。
1
2
3
4
5
6
7
8
9
10
mkdir project1
cd project1
python -m venv project_venv # 创建虚拟环境,project_venv 为虚拟环境名字
# 建议将该文件夹加入.gitignore,以便让 Git 忽略

project_venv\Scripts\activate # Windows

source ./project1_venv/bin/activate # Linux
(project1_venv)$ pip install torch # 正常使用 pip 安装包
(project1_venv)$ deactivate # 退出

pipreqs

pipreqs:扫描项目所使用的库,自动生成依赖清单(好像不太准的样子,没有安装的包也会检测出来)。

  • 好像不太准的样子,没有安装的包也会检测出来
1
2
pip install pipreqs
pipreqs ./ --encoding=utf-8 # windows 下可能有编码文件,需加个 encoding

pipdeptree

pipdeptree:显示当前环境下的 pip 依赖树

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
pipdeptree
ipython==7.14.0
- backcall [required: Any, installed: 0.1.0]
- colorama [required: Any, installed: 0.4.3]
- decorator [required: Any, installed: 4.4.2]
- jedi [required: >=0.10, installed: 0.17.0]
- parso [required: >=0.7.0, installed: 0.7.0]
- pickleshare [required: Any, installed: 0.7.5]
- prompt-toolkit [required: >=2.0.0,<3.1.0,!=3.0.1,!=3.0.0, installed: 3.0.5]
- wcwidth [required: Any, installed: 0.1.9]
- pygments [required: Any, installed: 2.6.1]
- setuptools [required: >=18.5, installed: 41.2.0]
- traitlets [required: >=4.2, installed: 4.3.3]
- decorator [required: Any, installed: 4.4.2]
- ipython-genutils [required: Any, installed: 0.2.0]
- six [required: Any, installed: 1.14.0]

pipdeptree --exclude pip,pipdeptree,setuptools,wheel
pipdeptree -f | tee locked-requirements.txt

pipdeptree --graph-output png > dependencies.png

poetry

poetry:可以使用 pyproject.toml,而 pyptoject.toml 昌 PEP 中的内容,是将来的方向

  • pyproject.toml:Python 项目中的一个配置文件,类似于旧版本的 requirements.txt,用于声明项目所需的依赖项和版本号
1
2
3
[build-system]
requires = ["poetry>=1.0.0"]
build-backend = "poetry.masonry.api"
  • 安装
1
pip install poetry
  • 使用
1
2
3
4
5
6
7
8
9
poetry init

poetry add requests

# 安装声明的依赖
poetry install

# pip 安装 toml文件中声明的依赖
pip install -r pyproject.toml

UV

#最佳实践

uv:Astral 公司(Rust 工具 Ruff 的开发者)推出的高性能 Python 包管理工具

  • 特点:
    • 极致的安装速度:基于 Rust 语言实现,比 pip 快 10-100 倍
    • 整合了 pip、virtualenv、pip-tools 等工具的功能(支持 pyproject.toml 和 uv.lock 文件)
    • 开发者友好
      • 智能缓存:默认启用全局缓存,减少重复下载
      • 环境分组:支持 --group dev--group production 区分开发与生产依赖,类似 Node.js 的 devDependencies
      • 无缝迁移:兼容现有 requirements.txtpyproject.toml 文件,降低迁移成本

基本操作

配置下载加速

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 配置全局uv源,UV_DEFAULT_INDEX 环境变量
# Windows:我的电脑->属性->高级系统设置 -> 环境变量,系统变量/用户变量中新建
变量名: UV_DEFAULT_INDEX
变量值:https://pypi.tuna.tsinghua.edu.cn/simple

# 用户级别源:%APPDATA%\uv\uv.toml
[[index]]
url = "https://pypi.tuna.tsinghua.edu.cn/simple"
default = true

# 项目级别源,项目目录下的 `pyproject.toml` 或 `uv.toml`
# pyproject.toml
[[tool.uv.index]]
url = "https://pypi.tuna.tsinghua.edu.cn/simple"
default = true

# uv.toml
[[index]]
url = "https://pypi.tuna.tsinghua.edu.cn/simple"
default = true

# 临时指定:
uv add --default-index https://pypi.tuna.tsinghua.edu.cn/simple requests

日常使用

1
2
3
4
5
6
7
8
9
10
11
12
# Python 版本管理
# 直接安装有指定解释器
uv python install 3.12

# 虚拟环境创建
uv venv --python 3.12

# 依赖锁定:生成跨平台一致的 uv.lock 文件
uv sync

uv add
uv run

遇到的问题

  • 问题:uv venv中没有pip:python -m pip报错:No module named pip
  • 解决方案:官方表示这是特性而不是bug,为了提升环境创建速度(毫秒级)、减少初始体积,鼓励使用 uv sync 而不是 pip install
1
2
3
4
5
6
7
8
9
10
11
12
13
14
uv venv --seed .venv # 会自动安装 pip、setuptools、wheel


# 1. 激活虚拟环境
D:\Projects\ComfyUI\.venv\Scripts\activate

# 2. 下载 get-pip.py 脚本(修复 pip 的官方工具)
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py

# 3. 用虚拟环境的 Python 执行脚本安装 pip
python get-pip.py

# 4. 验证 pip
pip --version

ruff

ruff

给博主来一杯卡布奇诺