Poetry科学管理Python虚拟环境

环境管理工具之Poetry

经过我疫情期间测试,此包稳定活跃,我也准备将它作为今后必用包之一,特此推荐
喜欢钻研的盆友,请认真阅读并学习,后续我更新的教程将以此为创建环境的主要工具
作者:MC.Lee 李明昌

Poetry是什么

  • 之前我推荐过pipenv来创建一项目一环境的python环境,但是,pipenv在使用中有速度极慢,切在它的官方github上被各路大神提出极多的bug,导致一些不可描述的问题。

  • 虽然pipenv小火了一下,但由于被扒出糟糕的设计和使用体验,越来越多的开发者逐渐抛弃了它,而且它也有将近1年多未进行更新(修复已知bug)

  • 因此,我们找到相似的一个库【Poetry】,它也是一个流行的python包管理工具,我们将使用它来创建我们的隔离环境

  • Poetry自带PYPI默认发布库,可以直接将你的包发布到pypi上,它的更新非常活跃,最近的新版本添加了poetry new命令,一键创建项目目录

  • 他的命令和用法越来越贴近前端的脚手架模式,使用熟练后你会爱上他~

    安装

  • 安装前,请保证自己的系统已经安装python3.4+以上版本,Poetry需要它

  • 2020年3月,清华源的Minianaconda更新了python3.8版本的,我这里已预先安装了此最新版

  • anaconda结合poetry,由conda抓取不同版本的python,由poetry管理开发项目的python虚拟环境

  • Win10系统

    • 最新的win10系统已经支持curl命令,我们使用curl https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python即可一键安装
    • 由于国外网络,各位同学可能需要提前准备好如何访问国外网络
  • linux系统

    • curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python

因国外网络,安装下载时又没进度条,大家可以打开360的流量防火墙监测下载情况

  • 安装完成后,我们按提示将路径加入环境变量
  • 使用命令查看版本,以验证poetry安装正确
    • poetry --version

基本使用

  • poetry创建的项目和vue-cli脚手架有些类似,它会生成一些目录和文件
  • 使用poetry new project_name创建你的项目,它的结构如下:
  • 项目包含主目录,测试目录,最重要的是pyproject.toml文件,它包含了环境的依赖和配置
  • 这时,仅仅是创建了你的项目目录,python环境并没有被创建

  • 我们来做几个配置,先看下基础配置poetry config --list

    • cache-dir 缓存目录(你之后下载的包缓存,如果其他项目用相同的包就不会重复下载)
    • repositories.foo.url 这是自定义存储库(也就是我们使用pip时候的安装源),这里截图时我已经测试过修改,下文有修改安装源方式,默认是没有这一项的
    • virtualenvs.create 是否创建虚拟环境,也就是下文当你安装新包进入此项目时,是否为此项目创建独立的虚拟环境
    • virtualenvs.in-project 虚拟环境是否在项目主目录内,默认false,我已经做了修改,使用poetry config virtualenvs.in-project true即可修改,如使用默认值fasle,则虚拟环境会创建在下面这个参数virtualenvs.path指定的路径内
    • virtualenvs.path 创建环境的路径

修改安装源

  • poetry config repositories.tuna https://pypi.tuna.tsinghua.edu.cn/simple
  • 上面的是安装源别名,可以随意取
  • 使用poetry config repositories.tuna --unset可以删除配置

初始化项目

  • 我们可以删除项目下的pyproject.toml文件,使用poetry init初始化项目
  • 前面是一般项目的信息填写,选择python版本时,你的系统内必须有此版本,你可以使用miniconda来拉取你的python版本
  • 接下来会让你定义主依赖包(main dependencies),如果你输入yes,比如你这个项目是用django开发,输入yes后可以输入django,他会将此包依赖添加到[tool.poetry.dependencies]
  • 然后是定义开发环境主要依赖,比如你需要添加一些测试,如pytest,他会将此包依赖添加到[tool.poetry.dev-dependencies]

创建环境

  • 做完项目初始化后,使用poetry install,即可一键生成你的虚拟环境,由于我们上面修改过环境目录,会在你的主项目目录下生成一个.venv文件夹,里面就是你的虚拟环境

  • 当你的项目完成时,可以使用poetry install --no-dev,来创建生产环境

添加包

  • poetry add pkg_name,例如:poetry add flask

查看项目依赖

  • 使用poetry show可以查看当前项目已安装的主要包(依赖)

  • 到这里你可能发现,你的项目多了一个poetry.lock文件,它会存储你的主要依赖所需要的依赖结构和一些包的hash值,以保证项目环境的一致性。

    • 当你拿着pyproject.toml移植到另一台机器,没有带poetry.lock文件时,执行poetry install,会自动根据主依赖下载最新的包版本
    • 当你拿着pyproject.tomlpoetry.lock移植到另一台机器,执行poetry install,会根据poetry.lock内的值,下载你创建项目是的包版本,即使你开发过程中所依赖的包有更新,也不会导致你的项目发生冲突
  • 使用poetry show -t可以详细的看到,各主依赖的依赖关系

  • 这样明确的依赖关系会使你管理包非常的方便,不会出现卸载不干净的情况

  • 使用poetry remove pkg_name卸载包时,会将此包的依赖一同卸载

  • 到此,干净!漂亮!!!

运行python脚本

  • 你并不需要激活环境来运行python脚本,使用poetry run python XXXXX即可运行你的python文件,poetry会自动查找项目中的虚拟环境
  • 也可以使用poetry shell激活一个环境来运行你的python脚本

自定义命令

  • pyproject.toml文件中可以添加自定义命令,从而通过poetry run来快速执行
  • 如:添加一个flask的快速启动命令
    • 命令格式为命令名称 = "包名.模块名:模块中的函数或方法"
      1
      2
      [tool.poetry.scripts]
      my-flask = "51_f.app:main"
  • 依次创建如下文件和代码
  • 即可使用poetry run my-flask快速启动脚本

环境管理

  • 默认情况下,Poetry 将尝试使用当前激活的 Python 版本为当前项目创建虚拟环境
  • 但是,由于各种原因,此 Python 版本可能与项目的要求不兼容。在这种情况下,诗歌将试图找到一个是,并使用它。如果无法执行此操作,系统将提示您显式激活一个。
  • 如使用anaconda,已创建一个名称为py27的环境,python版本为python 2.7:
    1
    2
    conda activate py27
    poetry install
  • 由conda抓取的2.7环境会被安装在项目目录下(前提已设置in-project和修改来主依赖版本为2.7)

  • 有时需要更明确的控制环境,为此,可以使用 命令告诉 Poetry 当前项目要使用哪个 Python 版本
    • poetry env use /full/path/to/python
    • 如果中具有 python 可执行文件,则可以使用poetry env use python3.7

显示环境信息

  • poetry env info
  • 如果只想知道到虚拟环境的路径,可以将该选项传递给:--path

列出与项目关联的环境

  • poetry env list

删除现有的虚拟环境

  • poetry env remove
  • 将环境安装在项目目录时,直接删除.venv目录即可

其他操作

  • poetry self update更新poetry到最新版本
  • poetry update pkg_name 更新项目内的某个包
  • poetry publish将你的包默认发布到pypi,如果传递--build参数还可以生成包
    • 如你在pypi上完成注册,可以使用如下命令发布:
    • poetry publish -u 用户名 -p 密码
    • 添加 -r参数可以选择自定义存储库
  • poetry lock 锁定 (不安装) 中指定的依赖项
  • poetry search pkg_name 在远程索引上搜索包。
  • poetry check 验证pyproject.toml文件的结构,并在出现任何错误时返回详细的报告

发布到pypi前的设置

  • 要发布到 PyPI,可以为名为PyPI的存储库设置凭据(token 用户名密码)
    • 建议将包上载到 PyPI 时使用API 令牌poetry config pypi-token.pypi my-token
    • 如果仍要使用用户名和密码,则可以使用以下调用poetry config http-basic.pypi username password
  • 如果要为特定存储库存储凭据(token 用户名密码),可以执行此操作:
    • 如上文设置的tuna库poetry config http-basic.tuna username password

配合VS Codepython扩展设置

  • setting.json文件中,添加如下设置:
    1
    2
    3
    "python.pythonPath": "${workspaceRoot}/.venv/Scripts/",
    "python.autoComplete.addBrackets": true,
    "python.autoComplete.extraPaths": ["${workspaceRoot}/.venv/Lib/site-packages",]
  • 以上设置依次是:解释器路径、自动完成(补全括号)、自动完成(扩展路径)
    • 扩展路径是个列表,注意添加逗号
  • 这样设置后,你的每个项目只要被打开就会获得对应项目的python解释器路径,而不需要再去设置或者选择
打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

请我喝杯咖啡吧~

支付宝
微信