奇奇怪怪

安全小技巧

新的一天开始了

剪刀石头布,哈,我又赢了

2024

02-20


前言

简介

依赖包

Python的依赖包是指在Python生态系统中,开发者可以通过软件仓库来获取和安装的第三方模块或库。这些依赖包是由Python社区的开发者们开发和维护的,用于扩展Python的功能和提供各种功能和工具。在一个使用python开发的项目中,需要先安装相关依赖包才可以运行。

项目文件

在一个 python 项目中,可能会存在着,requirements.txtsetup.pyPipfilePipfile.lock,**poetry.lock** 等等文件,这些都是定义当前项目所需要的依赖包的相关文件,用于确定当前项目运行、测试等等所需要的依赖包

requirements.txt

requirements.txt是一个在python项目中常见的文本文件,用于列出项目所依赖的具体Python库及其版本号。

例如:

1
2
3
4
5
6
7
8
SomeProject
SomeProject == 1.3
SomeProject >= 1.2, < 2.0
SomeProject[foo, bar]
SomeProject ~= 1.4.2
SomeProject == 5.4 ; python_version < '3.8'
SomeProject ; sys_platform == 'win32'
requests [security] >= 2.8.1, == 2.8.* ; python_version < "2.7"

虚拟环境

Python 虚拟环境是一种用于隔离Python项目的方式,创建一个独立的Python环境,使得每个项目都可以拥有自己的依赖库和运行环境、程序版本,而不会相互干扰。从而不会导致多个项目之间因为依赖版本问题导致运行错误等等。所以在使用python时,可以为每个项目设置一个虚拟环境。物理环境则相反。


Pip

安装

  • 安装 python 后也包含了 pip。关于 python 的安装方法
  • windows:使用系统上的微软商店安装,搜索python,选择版本,点击安装,会自动配置好环境变量等环境。也可使用包管理器安装
  • linux:使用包管理器安装
  • mac:使用包管理器安装

使用

  • 升级 python -m pip install --upgrade pip
  • 安装软件包
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
28
29
30
31
python -m pip install SomePackage            
python -m pip install SomePackage==1.0.4
python -m pip install 'SomePackage>=1.0.4'

**项目文件中存在 requirements.txt 文件,以下命令安装该项目声明的所有依赖
python -m pip install -r requirements.txt

使用freeze命令根据当前文件夹生成requirements.txt
python -m pip freeze > requirements.txt**

指定包升级
python -m pip install --upgrade PackageName

升级所有
python -m pip install --upgrade

在“可编辑”模式下安装本地项目。方便本地调试修改包测试
python -m pip install -e . # 本地目录安装包
python -m pip install -e path/to/project # 指定目录安装包

指定软件仓库镜像地址安装包
python -m pip install --index-url http://my.package.repo/simple/ PackageName

要列出已安装的软件包:
python -m pip list

要显示有关已安装软件包的详细信息,请执行以下操作:
python -m pip show sphinx

用户安装,将包安装到用户特定的目录,实现与全局包隔离不冲突
python -m pip install --user SomePackage
  • 卸载软件包
1
2
3
4
5
卸载指定软件包
python -m pip uninstall simplejson

卸载requirements.txt 文件中列出的软件包
python -m pip uninstall -r requirements.txt
  • 常用功能
1
2
3
4
5
6
7
8
9
10
11
python -m pip list  列出所有

显示有关一个或多个已安装软件包的信息。
python -m pip show sphinx

生成需求文件
python -m pip freeze > requirements.txt

根据需求(及其所有依赖项)构建python包,然后安装
python -m pip wheel --wheel-dir=/tmp/wheelhouse SomePackage
python -m pip install --no-index --find-links=/tmp/wheelhouse SomePackage
  • 配置
1
2
配置默认pypi镜像地址,解决可能会存在的网络问题
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

总结

pip 是 python 默认的包管理器,使用广泛,但是在python的完整工作流中,功能单一不全,无环境隔离等功能,适合临时使用。


Pipx

安装 pipx

  • 使用pip安装pipx,pip install --user pipx
  • 添加环境变量保证可以直接运行 python -m pipx ensurepath

升级 pipx

  • python3 -m pip install --user -U pipx || -U 就是 - -upgrade

使用

  • 使用 pipx 安装python包
1
2
3
pipx install PACKAGE 安装指定包

pipx reinstall-all 重新安装已经安装的所有包
  • 或者,您可以在不安装程序的情况下运行它:
1
2
3
pipx run pycowsay moooo!

可以运行本地文件,以及远程仓库软件包
  • 列出安装的包
1
pipx list
  • 更新包
1
2
pipx upgrade package  更新指定包
pipx upgrade-all 更新所有包
  • 删除包
1
2
pipx uninstall package 删除指定包
pipx uninstall-all 删除所有包
  • pipx runpip
1
从虚拟环境中运行pip命令

总结

pipx 仅用于应用程序使用:您可以使用它安装 CLI 应用程序。所以使用场景仅仅是用它来安装使用一些python应用程序,pipx会自动隔离它们。并不作为项目环境,依赖管理,版本控制等使用场景。


Pipenv

功能特点

  • 您不再需要单独使用 pipvirtualenv :它们协同工作。
  • 管理虚拟环境以及依赖包

安装

  • pip install --user pipenv 使用 pip 安装。

常用功能

  • Pipfile.lock 替换了大多数 Python 项目中使用的 requirements.txt 文件,并增加了跟踪上次锁定的包哈希的安全优势。此文件通过锁定操作自动管理。应将 PipfilePipfile.lock 添加到项目的源代码管理中。
  • pipenv install -r path/to/requirements.txtrequirements.txt 导入包到pipfile
  • pipenv requirementspipfile 文件中生成requirements.txt 输出

参数选项

  • --where 输出项目环境物理路径
  • --venv 输出虚拟环境路径
  • --py 输出虚拟环境下 python 可执行文件路径
  • --envs 输出环境变量选项
  • --rm 删除当前目录下的虚拟环境
  • --support 输出pipfile.lock 文件内容
  • --site-packages / --no-site-packages 开启虚拟环境下的site-packages
1
2
操作系统接口的特定于平台的 Python 绑定通常只能通过系统包管理器使用,因此无法安装到具有 pip 的虚拟环境中。在这些情况下,可以创建具有系统 site-packages 目录访问权限的虚拟环境:
$ pipenv --site-packages
  • --python 指定 python 版本号
  • --clear 清除 pip pipenv 的缓存文件
  • -q, --quiet 安静模式
  • --pypi-mirror 设置软件包源
  • pipenv check 检查 PyUp Safety 安全漏洞以及 Pipfile 中提供的 PEP 508 标记。
  • pipenv clean [OPTIONS] 卸载 Pipfile.lock 中未指定的所有包。
  • pipenv graph [OPTIONS] 显示当前安装的依赖项关系图信息。
  • pipenv install [OPTIONS] [PACKAGES]… 安装提供的包并将它们添加到 Pipfile,或者(如果没有提供包),从 Pipfile 安装所有包。
1
pipenv install --dev 从Pipfile安装开发包类别和默认包类别
  • pipenv lock [OPTIONS] 生成 Pipfile.lock。
  • pipenv open [OPTIONS] MODULE 在编辑器中查看给定的模块。
  • pipenv requirements [OPTIONS] 从 Pipfile.lock 生成 requirements.txt。
1
2
pipenv requirements --dev  包含dev包
pipenv requirements > requirements.txt
  • pipenv run [OPTIONS] COMMAND [ARGS]… 运行一个安装在 virtualenv 中的命令。
1
pipenv run pip freeze 输出 requirements.txt 列表
  • pipenv shell [OPTIONS] [SHELL_ARGS]... 在 virtualenv 中生成一个 shell。
  • pipenv sync [OPTIONS] 安装 Pipfile.lock 中指定的所有包。
  • pipenv uninstall [OPTIONS] [PACKAGES]… 卸载提供的包并将其从 Pipfile 中删除。
1
2
pipenv uninstall --all  删除虚拟环境中的所有包,但不删除pipfile 文件
pipenv uninstall --all-dev 从虚拟环境中删除所有开发包,并删除pipfile文件
  • pipenv update [OPTIONS] [PACKAGES]… 在未指定包或升级时运行锁定,然后进行同步。
  • pipenv upgrade [OPTIONS] [PACKAGES]… 解析提供的包并将它们添加到 Pipfile,或者(如果没有给出包),将结果合并到 Pipfile.lock
  • pipenv verify [OPTIONS] 验证 Pipfile.lock 中的哈希值是否为最新。

工作流程

  • cd myproject 进入项目文件夹
  • pipenv sync 如果有pipfile文件,从pipfile文件安装包
  • pipenv install <package> 安装包,将包添加到pipfile文件中
  • pipenv install --dev 安装所有包,以及dev包
  • pipenv update 更新所有包
  • pipenv upgrade <package> 指定包更新
  • pipenv shell 进入虚拟环境交互式shell

总结

pipenv 简洁易用,对于需要快速部署环境隔离,项目运行部署,pipenv是一个不错的选择,pipenv拥有版本控制,环境隔离,依赖安装等等功能。使用场景,当前有一个python项目需要测试运行,需要使用到隔离环境,安装依赖,pipenv是可以说最快速的一个方案。


Conda

安装

conda 的安装包分为两种 Miniconda 和 Anaconda。根据自己需求选择包安装。

Miniconda 是 Anaconda 提供的最小安装程序。如果您想自己安装大多数软件包,请使用此安装程序。

Anaconda Distribution 是一个功能齐全的安装程序,带有一套用于数据科学的软件包,以及 Anaconda Navigator,一个用于处理 conda 环境的 GUI 应用程序。


打开命令行执行命令验证是否安装成功:conda --version

使用

  • conda --version 查看conda信息
  • conda update conda 更新conda
  • conda --help 查看帮助信息
  • conda create -h 指定命令查看帮助信息
  • conda info --verbose 显示conda所有信息

环境管理

  • conda create --name <my-env> 创建环境
  • conda create -n myenv python=3.9 指定python版本创建
  • conda create -n myenv scipy 指定特定软件包创建
  • conda create -n myenv scipy=0.17.3 指定特点版本软件包创建
  • conda create -n myenv python=3.9 scipy=0.17.3 astroid babel 指定python 版本,软件包版本创建
  • conda run -n my-python-env python --version 使用conda环境运行软件包
  • conda install -n myenv pip 在环境中使用pip,应该在conda确实没有包安装的时候才使用pip
1
2
Pip 应该运行( --upgrade-strategy only-if-needed 默认值)。
不要将 pip 与 --user 参数一起使用,避免所有用户安装。

.condarc 这个配置文件存在每次创建环境自动安装的软件包,可以修改添加删除

conda create --no-default-packages -n myenv python 指定--no-default-packages 选项表示不安装 .condarc 文件中的包

  • conda create --name myclone --clone myenv 复制一个存在的环境
  • conda activate myenv 激活环境,指定环境名称或者路径
  • conda deactivate 停用环境
  • conda env list 环境列表
  • conda list 列出环境中的软件包
  • conda env config vars list 列出环境变量
  • conda env config vars set my_var=value 设置环境变量,设置环境变量后需要重新激活环境
  • conda env config vars unset my_var -n test-env 取消设置环境变量
  • conda env export > environment.yml 导出环境

还原环境

  • conda list --revisions 列出历史环境
  • conda install --revision=REVNUM 指定历史环境还原
  • conda remove --name myenv --all 删除环境

软件包管理

conda config --add channels conda-forge
conda config --set channel_priority strict

☺️ 添加conda-forge通道的软件包,里面包含除了默认仓库的大量软件包

  • conda search scipy 搜索指定软件包
  • conda install --name myenv scipy 安装指定软件包到指定环境
  • conda install scipy 安装到当前环境
  • conda install scipy=0.15.0 指定版本号
  • conda install scipy curl 一次安装多个

如果某个包无法从 conda 或 Anaconda.org 获得,您可以通过 conda-forge 或其他包管理器(如 pip)找到并安装该包。

  • conda install pip 在当前环境安装 pip 集成使用

conda config --set pip_interop_enabled True

提高与 pip 的互操作性#,通过这种互操作性,conda 可以使用 pip-installed 包来满足依赖项,干净地删除 pip-installed 的软件,并在适当的时候用 conda 包替换它们。

  • conda search package_name --info 列出包依赖
  • conda update biopython 更新指定软件包
  • conda update python 更新环境中的python
  • conda update conda 更新conda本身
  • conda update --update-all 更新环境中所有已安装的软件包。
  • conda update --force-reinstall 确保卸载并重新安装当前操作的任何用户请求的包,即使该包已存在于环境中。
  • conda update numpy --no-pin 跳过版本限制更新包
  • conda config --add create_default_packages PACKAGENAME1 PACKAGENAME2 添加默认软件包,创建新环境,默认软件包将安装在所有环境中。也可以编辑 .condarc 文件
  • conda remove -n myenv scipy 指定包删除
  • conda remove scipy 删除当前环境中的指定包
  • conda remove scipy curl 删除多个包
  • conda clean --all 删除索引缓存、锁定文件、未使用的缓存包、压缩包和日志文件。
  • conda list 列出当前环境安装的所有包
  • conda list -n myenv 列出指定环境名称的所有包

python 管理

  • conda search python 搜索可用的python包
  • conda update python 更新python
  • conda install python=3.10 安装指定版本

environment.yaml 文件

例如

1
2
3
4
5
name: my-project
channels:
- defaults
dependencies:
- python
  • Name : 环境名称指定
  • Channels: 软件包渠道,可指定,defaults,conda-forgebioconda等等。

官方Channels由Anaconda公司维护,包括:

  • defaults:默认的Channel,包含Anaconda公司提供的核心包和工具。
  • conda-forge:由社区维护的Channel,包含丰富的包和工具,包括许多最新版本的软件。
  • bioconda:专门用于生物信息学相关包的Channel。
  • conda-envs:专门用于为特定项目创建虚拟环境的Channel。

可自行选择到各大镜像站选择 channels (软件仓库)

  • Dependencies: 指定依赖包,如python,pip等等。

conda env create --file environment.yml 随后指定项目文件创建环境,
conda env update --file environment.yml 修改文件后,指定项目文件更新


conda配置文件 .condarc

  • conda config --show 显示计算和编译的配置值。未给出参数,则显示所有配置值的信息。
  • conda config --describe 列出所有配置文件信息,可配置选项。
  • conda config --get 获取所有配置信息
  • conda config --get channels 指定配置获取
  • conda config --show-sources 显示所有配置文件源及其内容
  • conda config --add channels http://conda.anaconda.org/mutirri 添加配置
  • conda config --remove channels http://conda.anaconda.org/mutirri 删除配置
  • conda config --remove-key channels 删除某个键值

示例文件

下面命令可列出所有配置文件信息

  • conda config --describe 列出所有配置文件信息,可配置选项。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# This is a sample .condarc file.
# It adds the r Anaconda.org channel and enables
# the show_channel_urls option.

# channel locations. These override conda defaults, i.e., conda will
# search *only* the channels listed here, in the order given.
# Use "defaults" to automatically include all default channels.
# Non-url channels will be interpreted as Anaconda.org usernames
# (this can be changed by modifying the channel_alias key; see below).
# The default is just 'defaults'.
channels:
- r
- defaults

# Show channel URLs when displaying what is going to be downloaded
# and in 'conda list'. The default is False.
show_channel_urls: True

# For more information about this file see:
# https://conda.io/docs/user-guide/configuration/use-condarc.html

可选优化

libmamba solver

  • conda install -n base conda-libmamba-solver
  • 然后添加到 solver: libmamba~/.condarc
1
2
3
4
~/.condarc

...
solver: libmamba

总结

conda 是一个成熟的 python 项目管理的工具,conda 的优势在于其跨平台性、语言无关性和环境管理功能。带有版本控制,环境隔离,依赖包管理,软件包管理等等功能,对数据科学相关工作的用户尤其友好,conda 在数据科学、机器学习、人工智能等领域得到广泛应用。


Poetry

安装

  • pipx install poetry 安装
  • pipx install poetry==1.2.0 指定版本安装
  • pipx upgrade poetry 更新
  • pipx uninstall poetry 卸载

执行 poetry -V 或者 poetry about 查看版本信息,全局信息,验证是否安装成功。

管理 poetry 安装本身

  • poetry search poetry-plug 搜索插件
  • poetry self add poetry-plugin-export 安装插件
  • poetry self add poetry-core@latest 更新到最新版本 poetry-core
  • poetry self add artifacts-keyring 添加密钥环提供程序 artifacts-keyring
  • poetry self update 在其当前运行时环境中更新 Poetry 版本。
  • poetry self lock 锁定 poetry 本身的依赖到poetry.lock 文件
  • poetry self show 查看 poetry本身
  • poetry self show plugins 显示本身插件
  • poetry self remove poetry-plugin-export 删除插件
  • poetry self install --sync 针对 poetry 本身安装

使用

全局选项

  • --verbose (-v|vv|vvv) :增加消息的详细程度:“-v”表示正常输出,“-vv”表示更详细的输出,“-vvv”表示调试。
  • --help (-h) :显示帮助信息。
  • --quiet (-q) :不输出任何消息。
  • --ansi :强制 ANSI 输出。
  • --ansi :强制 ANSI 输出。
  • --version (-V) :显示此应用程序版本。
  • --no-interaction (-n) :不要问任何互动性问题。
  • --no-plugins :禁用插件。
  • --no-cache :禁用诗歌源缓存。
  • --directory=DIRECTORY (-C) :Poetry 命令的工作目录(默认为当前工作目录)。

创建新项目

  • poetry new poetry-demo 创建一个项目,指定名称为poetry-demo,可随意,项目文件包含以下内容。
1
2
3
4
5
6
7
poetry-demo
├── pyproject.toml
├── README.md
├── poetry_demo
│ └── __init__.py
└── tests
└── __init__.py

pyproject.toml 文件

pyproject.toml 文件是这里最重要的。这将协调您的项目及其依赖项。目前,它看起来像这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[tool.poetry]
name = "poetry-demo"
version = "0.1.0"
description = ""
authors = ["Sébastien Eustace <sebastien@eustace.io>"]
readme = "README.md"
packages = [{include = "poetry_demo"}]

[tool.poetry.dependencies]
python = "^3.7"

[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"

初始化已存在项目

  • Poetry 可用于“初始化”预填充的目录,而不是创建新项目。进入项目目录
  • poetry init 执行后交互式创建

安装依赖项

  • poetry install 该命令通过读取pyproject.toml 文件中的依赖包列表进行依赖安装。会有以下两种情况。
  • 第一种情况:项目中没有 poetry.lock 文件,会自动在项目中生成**poetry.lock** 文件,Poetry 只需解析 pyproject.toml 文件中列出的所有依赖项并下载其文件的最新版本。当 Poetry 完成安装后,它会将下载的所有包及其确切版本写入 poetry.lock 文件,并将项目锁定到这些特定版本。应将 poetry.lock 文件提交到项目存储库,以便所有处理该项目的人员都锁定到相同版本的依赖项。
  • 第二种情况:已经存在**poetry.lock**文件以及 pyproject.toml,运行 install会解析安装该文件列出的所有依赖包,
  • 作为应用程序开发人员应该将该两个文件提交到项目中确保能构建同样的依赖环境。作为库开发人员应该省略 poetry.lock文件

添加安装依赖

  • $ poetry add pendulum 该命令会将指定依赖软件包添加到pyproject.toml文件和poetry.lock文件中,并安装该软件包。

依赖包更新

  • poetry.lock 文件阻止您自动获取最新版本的依赖包。 要更新到最新版本,请使用 update命令。 这将根据pyproject.toml文件获取最新的匹配版本,并使用新版本更新锁定文件(poetry.lock)。 (这相当于删除 poetry.lock文件并再次运行 install。)
  • poetry update
  • poetry update requests toml 指定包更新
  • 该更新命令并不会修改pyproject.toml 文件,依然按照文件内容更新,可以使用 add 更新

依赖包删除

  • poetry remove pendulum 指定包删除
  • poetry remove mkdocs --group docs 指定依赖组删除指定包

虚拟环境

  • 默认情况下,新建项目或者初始化项目都会建立虚拟隔离环境
  • 激活虚拟环境的最简单方法是使用 poetry shell 创建嵌套 shell。测试环境时需先激活
  • poetry run python -V 该 run 命令在项目的 virtualenv 中执行给定的命令。
  • poetry cache list 列出缓存
  • poetry cache clear pypi --all 删除缓存
  • poetry env use /full/path/to/python 使用环境,
  • poetry env info 查看环境信息
  • poetry env info --path 指定目标查看环境信息
  • poetry env list 列出环境
  • poetry env list --full-path 列出完整路径环境
  • poetry env remove /full/path/to/python 删除环境
  • poetry env remove --all 删除全部环境

执行脚本

  • 要运行脚本,只需使用 poetry run python your_script.py .同样,如果您有命令行工具,例如 pytest or black ,则可以使用 poetry run pytest .

依赖包搜索

  • poetry search requests pendulum 搜索指定包

软件仓库

  • poetry source add pypi-test https://test.pypi.org/simple/ 添加pypi-test
  • poetry source show 显示软件源信息
  • poetry source show pypi-test 指定名称显示
  • poetry source remove pypi-test 删除源

依赖管理

依赖组

  • poetry 提供了可将依赖包分组的功能。用途:例如你的项目中会用到某些包来生成文档等等功能,但是该依赖包并不是项目运行所需要的,所以可以将其分组到其它依赖组中。
  • 文件示例:
1
2
3
4
5
[tool.poetry.group.test]  # This part can be left out

[tool.poetry.group.test.dependencies]
pytest = "^6.0.0"
pytest-mock = "*"
  • 定义dev依赖
1
2
3
[tool.poetry.group.dev.dependencies]
pytest = "^6.0.0"
pytest-mock = "*"
  • 可选组,依赖项组可以声明为可选。有一组仅在特定环境或特定用途中需要的依赖项时,这很有意义。
1
2
3
4
5
[tool.poetry.group.docs]
optional = true

[tool.poetry.group.docs.dependencies]
mkdocs = "*"
  • poetry install --with docs 指定组安装依赖
  • poetry add pytest --group test 指定组添加依赖,如果该组尚不存在,则将自动创建该组。
  • poetry install 默认安装所有组依赖
  • poetry install --without test,docs 指定排除组依赖安装
  • poetry install --only docs 仅安装指定依赖
  • poetry install --only main 仅安装项目运行依赖
  • poetry remove mkdocs --group docs 从组中删除依赖
  • poetry install --sync 同步依赖项,依赖项同步可确保 poetry.lock 文件中锁定的依赖项是环境中唯一存在的依赖项,从而删除任何不必要的内容。
1
2
3
4
5
poetry install --without dev --sync
poetry install --with docs --sync
poetry install --only dev

可组合使用

add 命令将所需的软件包添加到您的 pyproject.toml 并安装它们。如果不指定版本约束,poetry 会根据可用的包版本选择合适的版本。

  • poetry add requests pendulum 将包添加到pyproject.toml 并安装
  • poetry add "pendulum>=2.0.5" 指定版本
  • poetry add git+https://github.com/sdispater/pendulum.git 指定git
  • poetry add ./my-package/
  • poetry add ../my-package/dist/my_package-0.1.0.whl 指定本地目录或文件

信息查询

  • poetry show 列出所有可用的包,可以使用以下 show 命令。
  • poetry show pendulum 指定包列出详细信息
  • poetry config --list 列出配置信息
  • poetry checkcheck 命令验证 pyproject.toml 文件的内容及其与 poetry.lock 文件的一致性。
  • poetry version 显示poetry 版本号
  • poetry about about 命令显示有关 Poetry 的全局信息,包括当前版本和 poetry-core 的版本。
  • poetry help 显示全局帮助信息
  • poetry show --help 显示指定命令帮助信息
  • poetry list 列出所有可用的poetry命令

环境导出

  • poetry export -f requirements.txt --output requirements.txt 此命令将锁定文件导出为其他格式。
  • --format (-f) :要导出到的格式(默认值: requirements.txt )。目前,仅 constraints.txtrequirements.txt 受支持。

项目发布

  • Poetry 要求所有项目都符合 PEP 440 标准。
  • 可选发布poetry.lock文件,不发布可选将起添加到.gitignore文件(git)

发布到pypi

  • poetry build 将项目打包,此命令将以两种不同的格式打包库: sdist 是源格式, wheelcompiled 包格式。
  • sdist 格式是源代码格式,包含了 Python 源代码、许可证文件、README 文件等。用户需要自行编译 sdist 格式包才能安装使用。需要发布到 PyPI 的 Python 包必须使用 sdist 格式
  • wheel 格式是二进制格式,包含了编译好的 Python 代码、依赖库等。用户可以直接安装 wheel 格式包,无需自行编译。
  • poetry publish 将打包好的包进行发布,需要提前注册用户并且已正确配置凭据。如果要同时生成和发布包,只需传递该 --build 选项即可。
  • api token 注册pypi后账户查看。
  • 请注意,建议在将包上传到 PyPI 时使用 API 令牌。创建新令牌后,您可以告诉 Poetry 使用它:poetry config pypi-token.pypi <my-token>
  • 使用密码:poetry config http-basic.pypi <username> <password>

存储库

  • poetry source add foo https://pypi.example.org/simple/ 添加存储库
  • poetry add --source foo private-package 指定存储库安装包

环境配置

命令配置

  • poetry config --list 列出当前配置信息
  • poetry config virtualenvs.path 指定值查看配置信息
  • poetry config virtualenvs.path /path/to/cache/directory/virtualenvs 添加或更新配置
  • poetry config virtualenvs.path --unset 删除特定配置

环境变量配置方法

环境变量必须以 POETRY_ 设置的大写名称为前缀,并由大写名称组成,点和短划线替换为下划线,下面是一个示例:

但是我这边测试不需要加上 POETRY 前缀,加上识别不了环境变量,可自己环境测试。

  • export POETRY_VIRTUALENVS_PATH=/path/to/virtualenvs/directory
  • export POETRY_HTTP_BASIC_MY_REPOSITORY_PASSWORD=secret

项目配置文件 pyproject.toml

配置文件示例:

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
name = "my-package"   // 包名
version = "0.1.0" // 版本
description = "A short description of the package." // 描述
license = "MIT" // 许可证
authors = [
"Sébastien Eustace <sebastien@eustace.io>",
] // 作者
maintainers = [
"John Smith <johnsmith@example.org>",
"Jane Smith <janesmith@example.org>",
] //维护者
[tool.poetry]
# ...
readme = ["docs/README1.md", "docs/README2.md"] // 自述文件
homepage = "https://python-poetry.org/" // 项目主页网站
repository = "https://github.com/python-poetry/poetry" //存储库
documentation = "https://python-poetry.org/docs/" // 文档
keywords = ["packaging", "poetry"] // 关键字
[tool.poetry]
# ...
classifiers = [
"Topic :: Software Development :: Build Tools",
"Topic :: Software Development :: Libraries :: Python Modules"
] // 分类
[tool.poetry]
# ...
packages = [
{ include = "my_package" },
{ include = "extra_package/**/*.py" },
] //要包含在最终发行版中的包和模块的列表。
[tool.poetry.dependencies]
requests = "^2.13.0" // pypi 中的依赖指定

[[tool.poetry.source]]
name = "private"
url = "http://example.com/simple" // 其他存储库依赖指定

[tool.poetry.dependencies]
requests = { version = "^2.13.0", source = "private" } // 指定依赖存储库

[tool.poetry.dependencies]
python = "^3.7" // 声明 python 版本

基本工作流(对于测试已存在项目)

例举一个已存在项目的基本测试,配置虚拟环境,到安装依赖的基本流程。

  • cd 进入项目
  • poetry init -n 初始化项目
  • poetry shell 进入交互式 shell ,会自动建立虚拟隔离环境
  • poetry add $(cat requirements.txt) 安装当前项目依赖
  • poetry run python [yourpyname.py](http://yourpyname.py) 运行项目测试

总结

细心看文章的朋友可能会发现这个工具的介绍比较长,是因为poetry 功能更多,可以实现完整的python 工作流程,无论是对于开发者,还是测试人员,都可以满足其需求。使用场景,需要完整编写一个项目进行测试发布。或是测试一个已经存在的项目。文章前提到过 poetry 可以理解为 pipenv 的超集。那为什么还需要pipenv 呢,因为如果仅仅是用于已存在项目的测试的话,pipenv 可以更加方便的进行测试。大概就是这样了。


Hatch

安装

hatch 的包已经上传 pypi 。可以随意使用 pip,pipx 等等工具安装,也可以选择使用系统的包管理器安装,例如:

  • pip install hatch 使用 pip 安装
  • pipx install hatch 使用 pipx 安装到隔离环境
  • brew install hatch 使用 brew 安装到 mac
  • pacman -S python-hatch 使用 pacman 安装到 arch
  • 。。。😮

安装完成后命令行执行 hatch --version 验证是否安装成功


使用

全局指令

  • --verbose 显示详细信息
  • --quiet 安静模式,不显示信息
  • -help 显示帮助信息
  • --version 显示版本信息
  • --config 指定配置文件

新建项目

  • hatch new "Hatch Demo" 指定名称新建项目
  • 项目目录结构
1
2
3
4
5
6
7
8
9
10
hatch-demo
├── src
│ └── hatch_demo
│ ├── __about__.py
│ └── __init__.py
├── tests
│ └── __init__.py
├── LICENSE.txt
├── README.md
└── pyproject.toml

初始化现有项目

  • hatch new --init

环境管理

环境旨在为测试项目等提供隔离工作区。
生成 shell 或在 shell 中运行命令将自动触发创建。
在hatch 环境中只需要只用 pip 来安装 依赖包

  • hatch shell 进入hatch 交互式 shell ,会自动创建隔离环境
  • pip list 显示环境中的包
  • hatch run python -c "import sys;print(sys.executable)” 在 hatch 隔离环境中 使用 run 运行程序
  • hatch env show 显示隔离环境信息
  • hatch env remove 删除单个环境
  • hatch env prune 删除所有环境
  • hatch clean 删除生成项目
  • hatch dep show requirements -all 显示环境依赖信息
  • hatch env find 查看虚拟环境路径
  • hatch status 显示有关当前环境的信息。

项目文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[project]
name = "your-app" //项目名称
dynamic = ["version"] // 版本
description = '...' // 描述信息
readme = "README.md" // 自述文件
requires-python = ">=3.8" // python 版本
license = "Apache-2.0 OR MIT"// 许可证
keywords = [
"...",
] // 关键字
classifiers = [
"...",
] // 分类信息

[project.urls]
Documentation = "..."
"Source code" = "..." // url信息

dependencies = [
"...",
] // 依赖信息

命令控制

  • hatch config set [OPTIONS] KEY [VALUE] 设置配置文件
  • hatch config find 查看配置文件位置
  • hatch config restore 配置文件恢复默认
  • hatch config show -a 显示所有配置信息
  • hatch config update 更新配置文件

依赖管理

  • 添加依赖,编写pyproject.toml 文件,并将其添加到组中 dependencies,例如cowsay:
  • 下次生成 shell 或运行命令时,将安装此依赖项。
1
2
3
4
5
6
7
8
[project]
...
dependencies = [
"cryptography",
"click>=7, <9, != 8.0.0",
"python-dateutil==2.8.*",
"numpy~=1.21.4",
]

构建发布包

在配置文件中配置构建信息,

  • hatch build -t wheel 指定格式构建
  • hatch publish 发布包
  • -r / --repo 指定仓库发布
  • hatch build 将构建 sdist 和 wheel 包
  • hatch build -t wheel 指定包格式构建,例如 -t sdist -t wheel
  • hatch publish 发布包
  • hatch publish /path/to/artifacts foo-1.tar.gz 指定包发布

常用参数

  • --target, -t 指定构建格式,例如 -t sdist -t wheel
  • --clean, -c 构建前清除原有包文件
  • -r / --repo 选择存储库,默认pypi
  • -u/ --user-a/ --auth 设置认证
  • --client-key 配置客户端密钥

版本控制

  • hatch python install all 在环境中安装所有兼容的python 版本
  • hatch python update all 更新 所有python 版本
  • hatch python find 查看python 二进制文件信息
  • hatch python remove all 删除 python ,所有已安装
  • hatch python show 显示可用python信息

Hatch 常用插件

基本工作流程

  • hatch new --init . 创建或初始化项目
  • hatch shell 进入交互式shell
  • pip install -r requirements.txt 安装项目依赖
  • hatch run python [pyfile.py](http://pyfile.py) 测试运行
  • hatch env remove 删除环境

总结

“Hatch 的高级价值主张是,如果一个人采用了所有功能,那么许多其他工具就变得不必要,因为它支持人们可能需要的一切。此外,如果选择仅使用特定功能,那么与替代方案相比仍然有好处“。以上这段话来自hatch 官方,本篇文章介绍了多种关于 python 项目管理的工具,功能相似但却有不同之处,我们不需要思考什么是最好的工具,我们只需要在不同的场景,选择合适的工具。最合适的方案。


Pdm

安装

  • pipx install pdm 将pdm安装到隔离环境,使用pipx
  • pdm self update 更新 pdm

也可使用其他包管理器安装。

pdm 自身管理

  • pdm self list 列出关于 pdm 的所有包
  • pdm self add packagename 指定包安装给pdm
  • pdm self remove packagename 删除pdm环境中的包
  • pdm self remove update 更新 pdm 本身

项目管理

  • pdm init 初始化项目
  • pdm init -n 跳过交互式初始化,使用默认配置
  • pdm lock:执行 lock任务 ,从pyproject.toml 文件中锁定依赖
  • pdm sync 从锁定文件同步(添加/删除/更新)
  • pdm install:执行 sync任务,先于 lock如果需要
  • pdm add:添加依赖包,重新锁定然后同步
  • pdm remove:删除依赖要求,重新锁定然后同步
  • pdm update:从最新版本重新锁定依赖项,然后同步
  • pdm use 切换python
  • pdm run flask run -p 54321 运行脚本程序等
  • pdm run --list 显示脚本列表
  • pdm fix 根据最新版本的PDM修复项目问题

环境管理

  • pdm config venv.backend [virtualenv|venv|conda]. 切换虚拟环境后端
  • pdm venv create 3.8 创建虚拟环境,指定python版本
  • pdm venv create --with venv 3.9 指定后端创建
  • pdm venv list 列出使用该项目创建的所有 virtualenv
  • pdm venv remove for-test 删除虚拟环境
  • pdm venv activate for-test 激活虚拟环境
  • pdm venv purge 清除 选定/所有 创建的 Virtualenv环境
  • pdm use --venv test 使用给定的 python 版本或路径作为基本解释器
  • pdm run python -m ensurepip 在项目中安装 pip
  • pdm venv create --with-pip 3.9 创建环境是包含 pip

配置管理

  • pdm config 显示当前配置信息
  • pdm config pypi.url 指定配置显示
  • pdm config pypi.url "https://test.pypi.org/simple" 传递参数修改配置
  • pdm config --local pypi.url "https://test.pypi.org/simple" 修改当前项目配置
  • pdm config pypi.url "https://test.pypi.org/simple" 修改软件仓库
  • pdm config pypi.extra.url "https://extra.pypi.org/simple" 添加额外软件仓库
  • pdm cache clear 清理缓存目录下的所有文件

依赖管理

导入其他依赖文件

  • -f {pipfile,poetry,flit,setuppy,requirements}, --format {pipfile,poetry,flit,setuppy,requirements}
  • pdm import 从其他格式导入项目元数据
  • pdm import --format requirements requirements.txt 导入 requirements.txt 文件依赖列表
  • pdm search httpx 搜索软件包
  • pdm show pyasn1-modules 显示指定包信息
  • pdm add requests 添加依赖
  • pdm add requests==2.25.1 指定版本
  • pdm add "flask>=1.0" 指定版本需求
  • pdm add ./sub-package 添加本地依赖,可以是目录和文件,需要以 . 开头
  • pdm add "https://github.com/numpy/numpy/releases/download/v1.20.0/numpy-1.20.0.tar.gz" 指定 url 添加依赖
  • pdm add -dG test pytest 通过指定组添加开发依赖
  • pdm add -e ./sub-package --dev 指定 -e 参数添加可编辑依赖
  • pdm update 更新依赖
  • pdm update --update-all 更新所有依赖项和子依赖项
  • pdm update requests 指定依赖包更新
  • pdm update -G security -G http / pdm update -G "security,http" 指定组更新依赖
  • pdm update -G security cryptography 更新指定组中的指定包依赖
  • pdm update -d 更新开发依赖包
  • pdm update -dG test pytest 更新指定组开发依赖包
  • pdm remove requests 删除依赖
  • pdm remove -G web h11 指定组删除依赖
  • pdm remove -dG test pytest-cov 删除开发依赖,指定组包
  • pdm sync 从锁定文件安装包。 --clean 选项,清除不需要的包
  • pdm update 将更新锁定文件,然后 sync .
  • pdm install 将检查项目文件是否有更改,如果需要,更新锁定文件,然后 sync .
  • pdm lock 生成依赖锁定文件
  • pdm lock -L/--lockfile <filepath> 指定依赖锁定文件
  • pdm install 安装锁定在 lockfile 中的所有组依赖
  • pdm install -G extra1 指定组安装
  • pdm list 列出packages目录中安装的所有软件包
  • pdm list --tree 树形列出
  • pdm export -o requirements.txt 导出依赖包格式

构建发布

  • pdm publish将自动构建一个 wheel 包和一个源代码包(sdist),并将它们上传到PyPI索引。
  • pdm publish --repository https://test.pypi.org/legacy/ 指定存储库,可以是url也可以是name
  • pdm publish --repository testpypi 指定存储库名称
  • -r--repository :要将包发布到的存储库名称或 url [env var: PDM_PUBLISH_REPO ]
  • -u--username : 访问存储库的用户名 [env var: PDM_PUBLISH_USERNAME ]
  • -P--password : 访问存储库的密码 [env var: PDM_PUBLISH_PASSWORD ]

单独生成发布

  • pdm build 构建包
  • pdm publish --no-build 发布,因为上一步构建了所以加上 --no-build 选项

构建配置,主配置文件中添加内容

  • 配置文件配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[repository.pypi]
username = "frostming"
password = "<secret>"

[repository.company]
url = "https://pypi.company.org/legacy/"
username = "frostming"
password = "<secret>"
ca_certs = "/path/to/custom-cacerts.pem"

或者设置环境变量
export PDM_PUBLISH_REPO=...
export PDM_PUBLISH_USERNAME=...
export PDM_PUBLISH_PASSWORD=...
export PDM_PUBLISH_CA_CERTS=...
  • 命令配置
  • pdm config repository.pypi.username "**token**"
  • pdm config repository.pypi.password "my-pypi-token"
  • pdm config repository.company.url "https://pypi.company.org/legacy/"
  • pdm config repository.company.ca_certs "/path/to/custom-cacerts.pem"

全局选项

  • -h--help :显示此帮助消息并退出。
  • -V--version : 显示版本
  • -c--config : 指定另一个配置文件路径 [env var: PDM_CONFIG_FILE ]
  • -v--verbose :用于 -v 详细输出和 -vv 更详细
  • -q--quiet :安静模式,不输出信息

插件

总结

功能强大,完善,适用于任何使用场景。与其他管理器相比,PDM 并没有被和一个特定的构建后端绑定,你可以选择任何你喜欢的构建后端。跨平台,使用简单,现代的,旨在成为下一代 Python 软件包管理工具,python项目管理器。


Rye

管理 Rye

统一安装

  • https://github.com/mitsuhiko/rye/releases 下载对应系统包进行安装。
  • cargo install --git https://github.com/mitsuhiko/rye rye 编译安装,因为Rye 是使用 rust 写的,所以可以用 cargo (rust 包管理器) 进行安装。
  • 以上两种方式是针对所有系统的安装方式,下面介绍单独的安装方式

针对系统安装

  • Linuxcurl -sSf https://rye-up.com/get | bash 使用官方脚本进行安装。
    也可以使用特定 Linux 发行版自己的包管理器进行安装,例如:sudo pacman -S rye
  • mac OScurl -sSf https://rye-up.com/get | bash ,使用官方脚本进行安装,也可以使用包管理器进行安装,brew install
  • Windows: 使用上述介绍的统一安装方式安装。

更新 Rye

  • rye self update

卸载 Rye

  • rye self uninstall

基本使用

项目管理

  • rye init my-project 创建一个新项目
  • rye init 或进入目录,初始化存在项目
  • rye init -r requirements.txt 初始化项目,从requirements.txt 文件中导入依赖
  • 目录结构
1
2
3
4
5
6
7
8
9
.
├── .git
├── .gitignore
├── .python-version
├── README.md
├── pyproject.toml
└── src
└── my_project
└── __init__.py

初始化同步

  • rye pin 3.10 可选指定版本,默认最新稳定版
  • rye sync 同步项目,会在项目目录中建立virtualenv隔离文件夹,.venv ,也会自动下载兼容的 python 解释器,生成requirements.lock requirements-dev.lock。以及根据项目文件安装依赖

激活环境

  • rye shell shell 生成一个激活 virtualenv 的 shell.。推荐方式
  • . .venv/bin/activate 标准激活环境方式
  • deactivate 退出环境
  • python -c "import sys; print(sys.prefix)" 查看python 可执行文件路径,确定隔离环境是否激活
  • rye run black 隔离环境运行程序

依赖管理

  • rye add "flask>=2.0" 指定依赖添加,并不会安装
  • rye sync 重新同步安装依赖
  • rye remove flask 删除依赖

环境管理

Rye 支持三种 python ,CPython,PyPy,自定义本地。

  • rye pin cpython@3.11.4 指定使用 cpython 版本
  • rye pin pypy 指定使用 pypy
  • rye toolchain list 列出 python 工具链
  • rye toolchain list --include-downloadable 查看可选安装的工具链列表
  • rye toolchain fetch pypy@3.10.12 安装工具链,不指定安装会默认安装
  • rye toolchain register /path/to/python 使用外部python 作为工具链
  • rye toolchain register --name=custom /path/to/python 指定名称,路径
  • rye toolchain remove cpython@3.8.5 删除工具链

全局工具安装

  • rye install ruff 安装全局工具
  • rye install black --features colorama 安装全局工具,传递额外依赖功能
  • rye tools list 列出安装工具
  • rye tools list --include-scripts 查看工具提供了什么脚本
  • rye uninstall black 删除工具

信息查看

  • rye show 显示当前环境信息
  • rye show --installed-deps 显示环境安装依赖
  • rye --version 显示rye 版本
  • rye help 显示帮助信息
  • rye command -h 显示命令帮助信息

依赖管理

requirements.lockrequirements-dev.lock 是rye项目的依赖锁定文件,pyproject.toml 文件为项目配置文件,除了存储当前项目配置信息,里面还有依赖配置信息

  • rye add Flask 添加依赖
  • rye add "Flask>=2.0" 指定版本添加
  • rye add "Flask[dotenv]" 添加额外依赖
  • rye add --dev black 添加开发依赖
  • rye add Flask --git=https://github.com/pallets/flask 添加git依赖
  • rye add My-Utility --path ./my-utility 添加本地依赖
  • rye sync 更新 lockfiles 以及 virtualenv
  • rye lock 只更新锁定文件
  • rye lock --update-all 更新所有依赖到最新合适版本,没有这个标志
    仅在必要时才会更新依赖项。
  • rye lock --all-features 额外依赖
  • rye sync --no-lock 不执行锁定步骤
  • rye sync --no-dev 不同步开发

构建发布

  • rye build 默认情况下, rye将在中构建 sdist 和 Wheel 目标 dist目录。
  • rye build --wheel --out target 使用 --sdist或者 --wheel标志来构建特定目标,或指定输出目录 --out.
  • rye build --clean 构建之前清理构建目录
  • rye publish 默认情况下,Rye 会将 dist 目录下的分发文件发布到 PyPI 中。
  • rye publish dist/example-0.1.0.tar.gz 指定文件发布
  • rye publish --repository testpypi --repository-url https://test.pypi.org/legacy/ 指定存储库
  • rye publish --token <your_token> --yes 指定 token ,自动确认

总结

这是本文章介绍的最后一款关于 python 项目管理的工具,本身也是一款功能完整的工具,和文章上述提到的pdm ,poetry ,hatch等等相似,都具有项目管理,版本控制,依赖管理,环境隔离等功能,几款工具有一些细微的差别,但都是非常优秀的 python 项目管理工具。大家可根据自己的爱好,习惯以及使用场景来选择合适的工具


🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦

总结

参考地址


Over 。 。 。 。

🥱🥱🥱🥱🥱🥱🥱🥱🥱🥱🥱🥱🥱🥱🥱🥱🥱🥱🥱

啊,再见了,再见了,哈

我们会再见的对么

再见你要幸福

燕子,燕子