首页 > 系统相关 >Linux下学习Python包管理器Poetry教程 零基础入门到精通

Linux下学习Python包管理器Poetry教程 零基础入门到精通

时间:2024-07-26 19:29:25浏览次数:14  
标签:管理器 Python lock Poetry dev poetry 虚拟环境 toml 模块

Poetry

[官网 - Poetry] https://python-poetry.org/

安装

pip install poetry

简单使用

初始化 poetry 项目

cd ~ && mkdir demo
poetry init

管理虚拟环境

poetry 预设了很多自己的虚拟环境配置,这些配置可以通过 poetry config 进行修改

当用户在执行 poetry add 等指令时,poetry 都会自动检查当下是否正在使用虚拟环境:

  • 如果是,则会直接安装模块到当前的虚拟环境下
  • 如果否,则会自动帮你创建一个新的虚拟环境,然后再安装模块

创建虚拟环境 (Linux 默认在 ~/.cache/pypoetry/)

# 虚拟环境的命名模式为 项目名-随机数-python版本
cd demo
poetry env use python
# 输出 Using virtualenv: /home/yin/.cache/pypoetry/virtualenvs/demo-NLZ_vRHG-py3.11

在当前项目创建虚拟环境

# 查看 poetry 的几个主要设定
poetry config --list
# 更改设置
poetry config virtualenvs.in-project true
# 先把之前创建的虚拟环境删除
poetry env remove python
# 重新创建虚拟环境
poetry env use python
# 输出 Using virtualenv: ~/demo/.venv

启动与退出虚拟环境

在项目目录下使用 poetry shell 就可以进入到虚拟环境

poetry shell 指令会检查当前目录或上层目录是否存在 pyproject.toml 来确定需要启动的虚拟环境

退出虚拟环境输入 exit

Poetry 指令

安装

poetry add

相较于 pip install , 例如使用命令 poetry add flask , poetry 会将全部信息列出来(flask 及其依赖)。

同时项目中的 pyproject.toml 会新增 flask = "^2.3.2" , 而 flask 的其余依赖不会出现在 toml 文件中。

这里是一个非常大的优点, 以便区分那些是用户安装的第三方模块, 那些是第三方模块一并安装的依赖。

poetry.lock 与更新顺序

除了更新 pyproject.toml , 此时项目中还会新增一个文件, 名为 poetry.lock , 它实际上就相当于 piprequirements.txt , 详细记录了所有安装的模块与版本。

当使用 poetry add 指令时, poetry 会自动依序帮你做完这三件事:

  1. 更新 pyproject.toml
  2. 依照 pyproject.toml 的内容,更新 poetry.lock
  3. 依照 poetry.lock 的内容,更新虚拟环境

由此可见, poetry.lock 的内容是取决于 pyproject.toml , 但两者并不会自己连动, 一定要基于特定指令才会进行同步与更新, poetry add 就是一个典型案例。

poetry lock :更新 poetry.lock

档自行修改了 pyproject.toml 内容, 此时 poetry.lock 的内容与 pyproject.toml 出现了脱钩., 必须让它依照新的 pyproject.toml 内容更新、同步, 使用指令

poetry lock

虚拟环境如果要重新建立, 是基于 poetry.lock 的内容来安装模块, 而非 pyproject.toml

但要特别注意的是, poetry lock 指令,仅会更新 poetry.lock ,不会同时安装模块至虚拟环境

因此,在执行完 poetry lock 指令后,必须再使用 poetry install 来安装模块。否则就会出现 poetry.lock 和虚拟环境不一致的状况。

更多 poetry lock 细节可参考 官方文件,其中特别值得注意的是 --no-update 参数

新增模块至 dev-dependencies

有些模块, 比如 pytestblack 等等, 只会在开发环境中使用, 产品的部署环境并不需要。

Poetry 允许你区分这两者,将上述的模块安装至 dev-dependencies 区块,方便让你轻松建立一份「不包含」 dev-dependencies 开发模块的安装清单。

在此以 Black 为例,安装方式如下:

poetry add black --group dev

结果的区别显示在 pyproject.toml 里:

[tool.poetry.dependencies]
python = "^3.10"
flask = "^2.3.2"

[tool.poetry.group.dev.dependencies]
black = "^23.7.0"

可以看到 black 被列在不同区块: tool.poetry.dev-dependencies

强烈建议善用 dev-dependencies

善用 --group dev 参数,明确区分开发环境,我认为非常必要。

Poetry 更新模块

使用 poetry update 更新所有模块

使用 poetry update requests toml 更新指定模块

注意 : 关于模块版本的升级限制规则,取决于你在 pyproject.toml 中的设定

列出全部模块清单

使用 poetry show

注意 : 这里的清单内容并不是来自于虚拟环境, 而是来自于 poetry.lock 的内容, 不一定和虚拟环境中的一样, 比如你使用了 pip install 指令安装模块, 就不会记载在 poetry.lock 中, 那 poetry show 自然也不会显示。

树状显示模块依赖层级

poetry show --tree

也可以只显示指定模块的依赖层级, 以 celery 为例:

poetry show celery --tree

Poetry 移除模块

使用 poetry remove 指令。和 poetry add 一样,可以加上 -D 参数来移除置于开发区的模块。

前面已经提过, pip uninstall 只会移除你所指定的模块, 而不会连同依赖模块一起移除, 这就是Poetry的优点

输出 dev-dependencies

因为 poetry export 预设只会输出 toml 中的 [tool.poetry.dependencies] 区块的模块!还记得上面我们把 Black 安装到 [tool.poetry.dev-dependencies] 了吗?

基于需求,必须输出 [tool.poetry.dev-dependencies] 的模块,才能看到 Black。

加上 --dev 参数即可:

poetry export -f requirements.txt -o requirements.txt --without-hashes --dev

输出的 requirements.txt 内容:

black==22.3.0; python_full_version >= "3.6.2"
click==8.1.2; python_version >= "3.7" and python_full_version >= "3.6.2"
colorama==0.4.4; python_version >= "3.7" and python_full_version >= "3.6.2" and platform_system == "Windows"
...

虽然长得有点不一样,但这个档案确实是可以 pip install 的。

Poetry 常用指令清单

  • poetry add
  • poetry remove
  • poetry export
  • poetry env use
  • poetry shell
  • poetry show
  • poetry init
  • poetry install

修改 poetry 镜像源

poetry source add tsinghua https://pypi.tuna.tsinghua.edu.cn/simple

标签:管理器,Python,lock,Poetry,dev,poetry,虚拟环境,toml,模块
From: https://blog.csdn.net/2301_79695159/article/details/140723219

相关文章

  • python 输入输出
    输入输出**注**所有内容均是在pycharm中通过python3.7的解释器进行运行的格式:变量=input('提示词')#输入提示词在控制台显示,要输入的内容在提示词后面输入print(变量)#输出print('输出内容')#在''内部的内容原封不动......
  • python——代码识别接口请求返回的图片中的内容
    【场景】测试使用图片验证码登录接口返回的是图片的base64编码,我们需要1、将base64编码转为图片2、去识别图片中的验证码,然后再拿验证码去做后续的图片验证码登录测试【参考链接】https://blog.51cto.com/u_16213316/10678659https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=......
  • python中的无损字典更新
    是否有一个库函数可以实现像这样的非破坏性字典更新defupdate(d,key,val):d=d.copy()d[key]=valreturnd在Python中,没有直接用于非破坏性字典更新的内置库函数。但是,你可以使用多种方法来实现相同的结果。1.使用dict.copy()和更新......
  • 上传到 Microsoft 应用商店的 Python 应用在上传 MSIX 或 .exe 文件之前是否需要获得
    我刚刚完成了桌面应用程序的开发工作,我想开始在Microsoft应用商店上销售该应用程序。我不确定许可部分。我想实现一种解决方案,当一个人下载应用程序时,他通过商店付费,如果他在下载时没有安装它,他获得的安装文件将被锁定,只能安装在同一台计算机上。如果他尝试在另一台计算机上使......
  • 网页抓取 雅虎财经 Python
    我正在尝试从损益表、资产负债表和现金流量报告中收集数据框中给定股票代码的雅虎财务数据。(下面提供了URL)我从使用yfinance的资产负债表中使用了此函数没有像雅虎财经那样的“总债务”但它只适用于股票代码“AAPL”而没有其他内容。我想要一个更强大的网络抓取......
  • Python Selenium 操作链可以工作,但会停止我在 Firefox 中的程序
    我有时使用ActionsChains时遇到任何问题,今天它不起作用,你知道为什么吗?scrolling_bar=driver.find_element(By.CSS_SELECTOR,"#scrolling_bar")start=scrolling_bar.locationActionChains(driver)\.drag_and_drop_by_offset(scrolling_bar,start......
  • 在 Python 中将 Kivy 文件选择器添加到 PopUp
    我一直在尝试通过应用程序的按钮释放创建文件选择器弹出窗口。我分别管理了FileChooser和Popups,但无法将两者一起解决,这里有人可以帮助解决问题吗?我正在尝试用Python而不是Kivy.lang来实现PopUp,因为这是我在弹出窗口方面的经验。我也无法让KivyDoc示例正常工作。我......
  • Python基础知识点(1)基本语句
    基本语句1.if语句if表达式:语句块其中,表达式是一个返回True或False的表达式。如果表达式为True,则执行if下面的语句块;如果为False,则跳过语句块执行下面的语句。2.if…else语句if表达式:语句块1else:语句块2其中,表达式是一个返回True或False的表达式。如果......
  • 使用Python实现深度学习模型:语言翻译与多语种处理
    引言语言翻译和多语种处理是自然语言处理(NLP)中的重要任务,广泛应用于跨语言交流、国际化应用和多语言内容管理等领域。通过使用Python和深度学习技术,我们可以构建一个简单的语言翻译与多语种处理系统。本文将介绍如何使用Python实现这些功能,并提供详细的代码示例。所需工具......
  • python框架之Flask
    之前写过有关flask-restful: https://www.cnblogs.com/xingxia/p/flask_restful.html虽然早期使用python进行web应用搭建的使用该框架,但是好像很少总结,在此记录一下 [安装]pip3installflask [使用]#导入类库fromflaskimportFlask#创建实例......