Python包管理工具之 PDM

发表于:2022-9-21 09:20

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:小姜    来源:运维开发故事

  前言
  大家好,我是小姜。之前讲了一个pipenv和poetry包管理工具,想必大家也和我一样去了解过pipenv所存在问题,所以不是很推荐使用。后来改成了poetry工具,但这个东西对我来说稍微有点麻烦,经常容易打错,虽然可以做成alias的形式。那么今天我给大家推荐一个叫PDM的工具,全称:Python Development Master。它也是非常好用,有兴趣的朋友可以使用一下。
  安装使用PDM
  # macos安装pipx
  brew install pipx
  pipx ensurepath
  # Linux安装pipx
  python3 -m pip install pipx
  python3 -m pipx ensurepath
  用pipx安装pdm
  PDM 只有 Python 3.7+ 的版本才能使用,使用其他的方法安装,要先保证你的 Python 版本,但使用 pipx 则不需要你去操心。一定要注意安装pipx的版本以及pipx安装pdm时使用的Python版本,否则 pdm init 会失败
  pipx install pdm
  pipx list
  配置 pdm 自动补全
  # zsh方法
  mkdir $ZSH_CUSTOM/plugins/pdm
  pdm completion zsh > $ZSH_CUSTOM/plugins/pdm/_pdm
  vim ~/.zshrc
  plugins=(
           pdm
           poetry
           git
           zsh-completions
           zsh-autosuggestions
  )
  source ~/.zshrc
  pdm info
  PDM初始化项目
  执行 pdm init 就会开始初始化,初始化的时候,会让你选择项目的一些信息:
  ·是否要上传 PyPI
  · 依赖的 Python 版本
  · License 类型
  · 作者信息
  · 邮箱信息 在初始化项目时会把机器上的所有 Python 版本都扫描出来了,会让选择项目的 Python 版本。
  > mkdir pdm-demo
  > cd pdm-demo
  # 重新执行pdm成功
  > pdm init
  Creating a pyproject.toml for PDM...
  Please enter the Python interpreter to use
  0. /Users/allenjol/.pyenv/versions/3.10.4/bin/python3 (3.10)
  1. /Users/allenjol/.pyenv/versions/3.10.4/bin/python (3.10)
  2. /Users/allenjol/.pyenv/versions/3.10.4/bin/python3.10 (3.10)
  3. /Users/allenjol/.pyenv/versions/3.10.4/bin/python3.10 (3.10)
  4. /Users/allenjol/.pyenv/versions/3.10.4/bin/python3 (3.10)
  5. /Users/allenjol/.pyenv/versions/3.10.4/bin/python (3.10)
  6. /Library/Frameworks/Python.framework/Versions/Current/bin/python3.10 (3.10)
  7. /Library/Developer/CommandLineTools/usr/bin/python3 (3.8)
  8. /Users/allenjol/.local/pipx/venvs/pdm/bin/python (3.10)
  Please select: [0]: 8
  Using Python interpreter: /Users/allenjol/.local/pipx/venvs/pdm/bin/python (3.10)
  Is the project a library that will be uploaded to PyPI? [y/N]: N
  License(SPDX name) [MIT]:
  Author name [allen_jol]:
  Author email [471733951@qq.com]:
  Python requires('*' to allow any) [>=3.10]:
  Changes are written to pyproject.toml.
  # 完成之后,PDM 会将你的选择以 toml 格式写入 pyproject.toml 配置文件中。
  ? ll
  total 8
  -rw-r--r--  1 allenjol  staff  283 May 20 13:58 pyproject.toml
  ? cat pyproject.toml
  [project]
  name = ""
  version = ""
  description = ""
  authors = [
      {name = "allen_jol", email = "471733951@qq.com"},
  ]
  dependencies = []
  requires-python = ">=3.10"
  license = {text = "MIT"}
  [tool.pdm]
  [build-system]
  requires = ["pdm-pep517>=0.12.0"]
  build-backend = "pdm.pep517.api"
  PDM 常用命令
  # 安装包
  pdm add requests
  # 查看包
  pdm list
  # 以树状形式查看
  pdm list --graph
  # 查看包的详情
  pdm show requests
  # 删除包
  pdm remove requests
  # 项目配置(不加任何参数,可以打印出该项目的环境配置)
  pdm config
  # 修改pypi源
  pdm config pypi.url http://mirrors.aliyun.com/pypi/simple
  pdm config pypi.url
  运行命令
  要在 pdm 的环境中执行命令或者项目,可以使用 run 命令,若是执行项目时,有诸多参数,可以在 pyproject.toml 配置命令别名
  $ cat main.py
  print('Hello, pdm')
  $ pdm run python main.py
  hello, pdm
  查看环境
  pdm info -v
  pdm info --env
  pdm info --packages
  pdm info --where
  pdm info --python
  更新包
  # 更新所有包
  pdm update 
  # 更新某个包
  pdm update <pkg>
  复杂的场景,pdm 也都为你考虑到了,它提供了很多选项,可以根据需要使用:
  --save-compatible:项目依赖可兼容的版本
  --save-wildcard:保存通配符版本(暂不明白)
  --save-exact:保存有指定确切版本的包
  --save-minimum:保持最小版本的包
  --update-reuse:尽量只更新命令行中指定的包,其依赖包能不更新则不更新
  --update-eager:更新某个包顺带更新其依赖包(递归升级)
  --prerelease:允许提前释放(暂不明白)
  --unconstrained:忽略包版本的约束,可将包升级至最新版本
  --top:仅更新有在 pyproject.toml 的包
  --dry-run:试运行,而不去修改 lock 文件
  --no-sync:只更新 lock 文件,但不更新包
  如果你的依赖包有设置分组,还可以指定分组进行更新
  pdm update -G security -G http
  也可以指定分组更新分组里的某个包
  pdm update -G security cryptography
  加个 -d 就可以再指定 dev 依赖
  # 更新所有的 dev 依赖
  pdm update -d
  # 更新 dev 依赖下某个分组的某个包
  pdm update -dG test pytest
  也可以指定 --prod 或者 --production 升级非 dev (即生产)的包。
  切换Python版本
  当你在初始化 pdm 项目时,就已经选定了当前的 Python 版本和可用的 Python 版本范围,后面如果想更改,可以使用 use 命令,但版本要受之前设定的版本范围约束。假设允许范围是 python 3.9+,当前使用的是 python 3.10,可以直接切换过去。
  pdm use python3.9
  命令别名
  在 pyproject.toml 添加 [tool.pdm.scripts] 可以设置快捷命令别名,若项目的执行有非常多的参数,这种设定别名的方法将很有用。
  $ tail -n 2 pyproject.toml
  [tool.pdm.scripts]
  start = 'python main.py'
  $ pdm run start
  Running cmd script: ['python', 'main.py']
  Hello, pdm
  [tool.pdm.scripts] 有两种形式
  # 第一种
  [tool.pdm.scripts]
  start = "python main.py"
  # 第二种
  [tool.pdm.scripts]
  start = {cmd = "python main.py"}
  若想在参数中加注释,就必须得使用第二种方法,例如这样
  [tool.pdm.scripts]
  start = {cmd = [
      "flask",
      "run",
      # Important comment here about always using port 54321
      "-p", "54321"
  ]}
  除了 cmd 之外,还有两个参数 一个是 shell 参数,从输出来看你应该和看出和 cmd 的区别,和 subprocess.Popen() with shell=True 差不多一个意思
  $ tail -n 2 pyproject.toml
  [tool.pdm.scripts]
  start = {shell = "python main.py"}
  $ pdm run start
  Running cmd script: python main.py
  Hello, pdm
  一个是 env_file 参数,可以指定配置环境变量的文件
  [tool.pdm.scripts]
  start.cmd = "flask run -p 54321"
  start.env_file = ".env"
  如果想要把这个环境变量的文件不仅限于某个命令,而是 pdm run 全局,可以这样配置
  [tool.pdm.scripts]
  _.env_file = ".env"
  方案兼容
  其他方案迁移到pdm
  pdm 足够好用,也足够开放,如果你当前使用的是其他的包管理器,比如 pipenv ,poetry,或者还在用最原始的 requirements.txt ,你也可以很方便的迁移到 pdm 中来:
  使用 pdm import -f 无需初始化,直接转换
  执行 pdm init 或者 pdm install 的时候,会自动识别你当前的依赖情况并转换 pdm迁移到其他方案 也可以当 pdm 管理的项目,导出为其他方案 pyproject.toml 和 pdm.lock是 pdm 的两个核心文件。pdm 做为一个后起之秀,也没有忘本,它支持:
  将 pyproject.toml 转成 setup.py
  pdm export -f setuppy -o setup.py
  将 pdm.lock 转成 requirements.txt
  pdm export -o requirements.txt
  pycharm 配置支持 PDM
  在命令行创建项目目录,进入项目目录执行init初始化,设置一下pypi源,然后使用pycharm打开这个目录。
  mkdir pdm-demo
  cd pdm-demo
  pdm config pypi.url
  pdm config pypi.url http://mirrors.aliyun.com/pypi/simple –-trusted-host mirrors.aliyun.com
  pdm config pypi.url
  # 永久设置 Linux下
  ? vi ~/.pip/pip.conf
  [global]
  index-url=https://mirrors.aliyun.com/pypi/simple/
  [install]
  trusted-host=mirrors.aliyun.com
  # 使用 pdm 安装一个包:
  pdm add -v requests flask
  完成安装后,我们可以在当前目录下看到__pypackages_目录,我们前面所安装的库就隔离安装在其下面,类似node的node_modules目录。这样就实现了项目级别的环境隔离效果,且无需创建额外的虚拟环境,要在IDE中使用pdm项目下的本地隔离库执行程序很简单,以pycharm为例,将pdm项目打开为pycharm工程之后,找到如图所示位置的lib文件夹,将其标记为Sources Root即可,同时记得将解释器选为pdm init初始化时所在环境相对应的。
  用pycharm打开pdm-demo项目,找到如图所示位置的lib文件夹,将其标记为Sources Root即可,同时记得将解释器选为pdm init初始化时所在环境相对应的Python解释器。
  pycharm设置Python解释器为pdm init初始化时所在环境相对应的Python解释器:先查看 pdm info 信息,可以看到 Python Interpreter 解释器路径
  ? pdm info
  PDM version:        1.15.0
  Python Interpreter: /Users/allenjol/.local/pipx/venvs/pdm/bin/python (3.10)
  Project Root:       /Users/allenjol/Documents/Codes/pdm-demo
  Project Packages:   /Users/allenjol/Documents/Codes/pdm-demo/__pypackages__/3.10
  pycharm设置 Python Interpreter 路径和pdm info 出来的一样即可。
  关于PDM的使用介绍到这里就结束了,看完后是不是觉得它很强大,也很有用。赶紧去试试吧!
  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号