Python 项目管理
奇奇怪怪
安全小技巧
新的一天开始了
剪刀石头布,哈,我又赢了
2024
02-20
前言
简介
依赖包
Python的依赖包是指在Python生态系统中,开发者可以通过软件仓库来获取和安装的第三方模块或库。这些依赖包是由Python社区的开发者们开发和维护的,用于扩展Python的功能和提供各种功能和工具。在一个使用python开发的项目中,需要先安装相关依赖包才可以运行。
项目文件
在一个 python 项目中,可能会存在着,
requirements.txt,setup.py,Pipfile和Pipfile.lock,**poetry.lock** 等等文件,这些都是定义当前项目所需要的依赖包的相关文件,用于确定当前项目运行、测试等等所需要的依赖包
requirements.txt
requirements.txt是一个在python项目中常见的文本文件,用于列出项目所依赖的具体Python库及其版本号。
例如:
1 | SomeProject |
虚拟环境
Python 虚拟环境是一种用于隔离Python项目的方式,创建一个独立的Python环境,使得每个项目都可以拥有自己的依赖库和运行环境、程序版本,而不会相互干扰。从而不会导致多个项目之间因为依赖版本问题导致运行错误等等。所以在使用python时,可以为每个项目设置一个虚拟环境。物理环境则相反。
Pip
安装
- 安装
python后也包含了pip。关于 python 的安装方法 - windows:使用系统上的微软商店安装,搜索python,选择版本,点击安装,会自动配置好环境变量等环境。也可使用包管理器安装
- linux:使用包管理器安装
- mac:使用包管理器安装
使用
- 升级
python -m pip install --upgrade pip - 安装软件包
1 | python -m pip install SomePackage |
- 卸载软件包
1 | 卸载指定软件包 |
- 常用功能
1 | python -m pip list 列出所有 |
- 配置
1 | 配置默认pypi镜像地址,解决可能会存在的网络问题 |
总结
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 | pipx install PACKAGE 安装指定包 |
- 或者,您可以在不安装程序的情况下运行它:
1 | pipx run pycowsay moooo! |
- 列出安装的包
1 | pipx list |
- 更新包
1 | pipx upgrade package 更新指定包 |
- 删除包
1 | pipx uninstall package 删除指定包 |
- pipx runpip
1 | 从虚拟环境中运行pip命令 |
总结
pipx 仅用于应用程序使用:您可以使用它安装 CLI 应用程序。所以使用场景仅仅是用它来安装使用一些python应用程序,pipx会自动隔离它们。并不作为项目环境,依赖管理,版本控制等使用场景。
Pipenv
功能特点
- 您不再需要单独使用
pip和virtualenv:它们协同工作。 - 管理虚拟环境以及依赖包
安装
pip install --user pipenv使用 pip 安装。
常用功能
Pipfile.lock替换了大多数 Python 项目中使用的requirements.txt文件,并增加了跟踪上次锁定的包哈希的安全优势。此文件通过锁定操作自动管理。应将Pipfile和Pipfile.lock添加到项目的源代码管理中。pipenv install -r path/to/requirements.txt从requirements.txt导入包到pipfilepipenv requirements从pipfile文件中生成requirements.txt输出
参数选项
--where输出项目环境物理路径--venv输出虚拟环境路径--py输出虚拟环境下 python 可执行文件路径--envs输出环境变量选项--rm删除当前目录下的虚拟环境--support输出pipfile.lock文件内容--site-packages / --no-site-packages开启虚拟环境下的site-packages
1 | 操作系统接口的特定于平台的 Python 绑定通常只能通过系统包管理器使用,因此无法安装到具有 pip 的虚拟环境中。在这些情况下,可以创建具有系统 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 | pipenv requirements --dev 包含dev包 |
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 | pipenv uninstall --all 删除虚拟环境中的所有包,但不删除pipfile 文件 |
pipenv update [OPTIONS] [PACKAGES]…在未指定包或升级时运行锁定,然后进行同步。pipenv upgrade [OPTIONS] [PACKAGES]…解析提供的包并将它们添加到 Pipfile,或者(如果没有给出包),将结果合并到 Pipfile.lockpipenv 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 应用程序。
- windows安装:https://docs.conda.io/projects/miniconda/en/latest/ 下载适用于系统版本包
- mac 安装:使用包管理器安装,如 brew
- linux 安装:使用对应发行版包管理器安装,如 pacman
打开命令行执行命令验证是否安装成功:
conda --version
使用
conda --version查看conda信息conda update conda更新condaconda --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 | Pip 应该运行( --upgrade-strategy only-if-needed 默认值)。 |
.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-forgeconda 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更新环境中的pythonconda 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更新pythonconda install python=3.10安装指定版本
environment.yaml 文件
例如
1 | name: my-project |
- Name : 环境名称指定
- Channels: 软件包渠道,可指定,
defaults,conda-forge或bioconda等等。
官方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 | # This is a sample .condarc file. |
可选优化
libmamba solver
conda install -n base conda-libmamba-solver- 然后添加到
solver: libmamba到~/.condarc
1 | ~/.condarc |
总结
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-corepoetry self add artifacts-keyring添加密钥环提供程序artifacts-keyringpoetry 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 | poetry-demo |
pyproject.toml文件
pyproject.toml 文件是这里最重要的。这将协调您的项目及其依赖项。目前,它看起来像这样:
1 | [tool.poetry] |
初始化已存在项目
- 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 updatepoetry 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.同样,如果您有命令行工具,例如pytestorblack,则可以使用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 | [tool.poetry.group.test] # This part can be left out |
- 定义dev依赖
1 | [tool.poetry.group.dev.dependencies] |
- 可选组,依赖项组可以声明为可选。有一组仅在特定环境或特定用途中需要的依赖项时,这很有意义。
1 | [tool.poetry.group.docs] |
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 | poetry install --without dev --sync |
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指定gitpoetry add ./my-package/poetry add ../my-package/dist/my_package-0.1.0.whl指定本地目录或文件
信息查询
poetry show列出所有可用的包,可以使用以下show命令。poetry show pendulum指定包列出详细信息poetry config --list列出配置信息poetry check该check命令验证pyproject.toml文件的内容及其与poetry.lock文件的一致性。poetry version显示poetry 版本号poetry aboutabout命令显示有关 Poetry 的全局信息,包括当前版本和poetry-core的版本。poetry help显示全局帮助信息poetry show --help显示指定命令帮助信息poetry list列出所有可用的poetry命令
环境导出
poetry export -f requirements.txt --output requirements.txt此命令将锁定文件导出为其他格式。--format (-f):要导出到的格式(默认值:requirements.txt)。目前,仅constraints.txt和requirements.txt受支持。
项目发布
- Poetry 要求所有项目都符合 PEP 440 标准。
- 可选发布
poetry.lock文件,不发布可选将起添加到.gitignore文件(git)
发布到pypi
poetry build将项目打包,此命令将以两种不同的格式打包库:sdist是源格式,wheel是compiled包格式。- 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/directoryexport POETRY_HTTP_BASIC_MY_REPOSITORY_PASSWORD=secret
项目配置文件 pyproject.toml
配置文件示例:
1 | name = "my-package" // 包名 |
基本工作流(对于测试已存在项目)
例举一个已存在项目的基本测试,配置虚拟环境,到安装依赖的基本流程。
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 安装到 macpacman -S python-hatch使用 pacman 安装到 arch- 。。。😮
安装完成后命令行执行
hatch --version验证是否安装成功
使用
全局指令
--verbose显示详细信息--quiet安静模式,不显示信息-help显示帮助信息--version显示版本信息--config指定配置文件
新建项目
hatch new "Hatch Demo"指定名称新建项目- 项目目录结构
1 | hatch-demo |
初始化现有项目
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 | [project] |
命令控制
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 | [project] |
构建发布包
在配置文件中配置构建信息,
hatch build -t wheel指定格式构建hatch publish发布包-r/--repo指定仓库发布hatch build将构建 sdist 和 wheel 包hatch build -t wheel指定包格式构建,例如-t sdist -t wheelhatch 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 常用插件
- https://github.com/repo-helper/hatch-requirements-txt 从
requirements.txt文件中读取项目依赖项。hatch 可以直接使用虚拟环境中的 pip 安装依赖从requirements.txt。
基本工作流程
hatch new --init .创建或初始化项目hatch shell进入交互式shellpip install -r requirements.txt安装项目依赖hatch run python [pyfile.py](http://pyfile.py)测试运行hatch env remove删除环境
总结
“Hatch 的高级价值主张是,如果一个人采用了所有功能,那么许多其他工具就变得不必要,因为它支持人们可能需要的一切。此外,如果选择仅使用特定功能,那么与替代方案相比仍然有好处“。以上这段话来自hatch 官方,本篇文章介绍了多种关于 python 项目管理的工具,功能相似但却有不同之处,我们不需要思考什么是最好的工具,我们只需要在不同的场景,选择合适的工具。最合适的方案。
Pdm
安装
pipx install pdm将pdm安装到隔离环境,使用pipxpdm self update更新 pdm
也可使用其他包管理器安装。
pdm 自身管理
pdm self list列出关于 pdm 的所有包pdm self add packagename指定包安装给pdmpdm 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切换pythonpdm 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列出使用该项目创建的所有 virtualenvpdm venv remove for-test删除虚拟环境pdm venv activate for-test激活虚拟环境pdm venv purge清除选定/所有创建的 Virtualenv环境pdm use --venv test使用给定的 python 版本或路径作为基本解释器pdm run python -m ensurepip在项目中安装 pippdm 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也可以是namepdm 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 | [repository.pypi] |
- 命令配置
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:安静模式,不输出信息
插件
- https://github.com/pdm-project/awesome-pdm 关于 pdm 的插件列表
总结
功能强大,完善,适用于任何使用场景。与其他管理器相比,PDM 并没有被和一个特定的构建后端绑定,你可以选择任何你喜欢的构建后端。跨平台,使用简单,现代的,旨在成为下一代 Python 软件包管理工具,python项目管理器。
Rye
管理 Rye
统一安装
- https://github.com/mitsuhiko/rye/releases 下载对应系统包进行安装。
cargo install --git https://github.com/mitsuhiko/rye rye编译安装,因为Rye 是使用 rust 写的,所以可以用 cargo (rust 包管理器) 进行安装。- 以上两种方式是针对所有系统的安装方式,下面介绍单独的安装方式
针对系统安装
- Linux :
curl -sSf https://rye-up.com/get | bash使用官方脚本进行安装。
也可以使用特定 Linux 发行版自己的包管理器进行安装,例如:sudo pacman -S rye - mac OS:
curl -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 | . |
初始化同步
rye pin 3.10可选指定版本,默认最新稳定版rye sync同步项目,会在项目目录中建立virtualenv隔离文件夹,.venv,也会自动下载兼容的 python 解释器,生成requirements.lockrequirements-dev.lock。以及根据项目文件安装依赖
激活环境
rye shellshell 生成一个激活 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指定使用 pypyrye 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.lock和requirements-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 以及 virtualenvrye 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 项目管理工具。大家可根据自己的爱好,习惯以及使用场景来选择合适的工具
🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦🐦
总结
参考地址
- https://packaging.python.org/en/latest/key_projects/#project-summaries
- https://pypi.org/help/#installing
- https://pip.pypa.io/en/stable/
- https://pipx.pypa.io/stable/
- https://wiki.archlinux.org/title/Conda
- https://docs.conda.io
- https://python-poetry.org/docs/
- https://hatch.pypa.io
- https://github.com/pypa/hatch
- https://github.com/pdm-project/pdm
- https://pdm-project.org/latest/
- https://github.com/mitsuhiko/rye
- https://rye-up.com/
Over 。 。 。 。
🥱🥱🥱🥱🥱🥱🥱🥱🥱🥱🥱🥱🥱🥱🥱🥱🥱🥱🥱
啊,再见了,再见了,哈
我们会再见的对么
再见你要幸福
燕子,燕子



