51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 964|回复: 0
打印 上一主题 下一主题

[python] 如何使用PDM来管理Python包?

[复制链接]
  • TA的每日心情
    无聊
    昨天 08:59
  • 签到天数: 946 天

    连续签到: 5 天

    [LV.10]测试总司令

    跳转到指定楼层
    1#
    发表于 2022-9-21 10:27:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    前言
      大家好,我是小姜。之前讲了一个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 会失败
    1. pipx install pdm
    2.   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 版本。
    1. > mkdir pdm-demo
    2.   > cd pdm-demo
    3.   # 重新执行pdm成功
    4.   > pdm init
    5.   Creating a pyproject.toml for PDM...
    6.   Please enter the Python interpreter to use
    7.   0. /Users/allenjol/.pyenv/versions/3.10.4/bin/python3 (3.10)
    8.   1. /Users/allenjol/.pyenv/versions/3.10.4/bin/python (3.10)
    9.   2. /Users/allenjol/.pyenv/versions/3.10.4/bin/python3.10 (3.10)
    10.   3. /Users/allenjol/.pyenv/versions/3.10.4/bin/python3.10 (3.10)
    11.   4. /Users/allenjol/.pyenv/versions/3.10.4/bin/python3 (3.10)
    12.   5. /Users/allenjol/.pyenv/versions/3.10.4/bin/python (3.10)
    13.   6. /Library/Frameworks/Python.framework/Versions/Current/bin/python3.10 (3.10)
    14.   7. /Library/Developer/CommandLineTools/usr/bin/python3 (3.8)
    15.   8. /Users/allenjol/.local/pipx/venvs/pdm/bin/python (3.10)
    16.   Please select: [0]: 8
    17.   Using Python interpreter: /Users/allenjol/.local/pipx/venvs/pdm/bin/python (3.10)
    18.   Is the project a library that will be uploaded to PyPI? [y/N]: N
    19.   License(SPDX name) [MIT]:
    20.   Author name [allen_jol]:
    21.   Author email [471733951@qq.com]:
    22.   Python requires('*' to allow any) [>=3.10]:
    23.   Changes are written to pyproject.toml.
    24.   # 完成之后,PDM 会将你的选择以 toml 格式写入 pyproject.toml 配置文件中。
    25.   ? ll
    26.   total 8
    27.   -rw-r--r--  1 allenjol  staff  283 May 20 13:58 pyproject.toml
    28.   ? cat pyproject.toml
    29.   [project]
    30.   name = ""
    31.   version = ""
    32.   description = ""
    33.   authors = [
    34.       {name = "allen_jol", email = "471733951@qq.com"},
    35.   ]
    36.   dependencies = []
    37.   requires-python = ">=3.10"
    38.   license = {text = "MIT"}
    39.   [tool.pdm]
    40.   [build-system]
    41.   requires = ["pdm-pep517>=0.12.0"]
    42.   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 配置命令别名
    1. $ cat main.py
    2.   print('Hello, pdm')
    3.   $ pdm run python main.py
    4.   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 文件,但不更新包
      如果你的依赖包有设置分组,还可以指定分组进行更新
    1.  pdm update -G security -G http
    复制代码
    也可以指定分组更新分组里的某个包
    1. pdm update -G security cryptography
    复制代码
    加个 -d 就可以再指定 dev 依赖
    1. # 更新所有的 dev 依赖
    2.   pdm update -d
    3.   # 更新 dev 依赖下某个分组的某个包
    4.   pdm update -dG test pytest
    复制代码
    也可以指定 --prod 或者 --production 升级非 dev (即生产)的包。
      切换Python版本
      当你在初始化 pdm 项目时,就已经选定了当前的 Python 版本和可用的 Python 版本范围,后面如果想更改,可以使用 use 命令,但版本要受之前设定的版本范围约束。假设允许范围是 python 3.9+,当前使用的是 python 3.10,可以直接切换过去。
    1. pdm use python3.9
    复制代码
    命令别名
      在 pyproject.toml 添加 [tool.pdm.scripts] 可以设置快捷命令别名,若项目的执行有非常多的参数,这种设定别名的方法将很有用。
    1. $ tail -n 2 pyproject.toml
    2.   [tool.pdm.scripts]
    3.   start = 'python main.py'
    4.   $ pdm run start
    5.   Running cmd script: ['python', 'main.py']
    6.   Hello, pdm
    复制代码
    [tool.pdm.scripts] 有两种形式
    1. # 第一种
    2.   [tool.pdm.scripts]
    3.   start = "python main.py"
    4.   # 第二种
    5.   [tool.pdm.scripts]
    6.   start = {cmd = "python main.py"}
    复制代码
    若想在参数中加注释,就必须得使用第二种方法,例如这样
    1.  [tool.pdm.scripts]
    2.   start = {cmd = [
    3.       "flask",
    4.       "run",
    5.       # Important comment here about always using port 54321
    6.       "-p", "54321"
    7.   ]}
    复制代码
    除了 cmd 之外,还有两个参数 一个是 shell 参数,从输出来看你应该和看出和 cmd 的区别,和 subprocess.Popen() with shell=True 差不多一个意思
    1. $ tail -n 2 pyproject.toml
    2.   [tool.pdm.scripts]
    3.   start = {shell = "python main.py"}
    4.   $ pdm run start
    5.   Running cmd script: python main.py
    6.   Hello, pdm
    复制代码
     一个是 env_file 参数,可以指定配置环境变量的文件
    1.  [tool.pdm.scripts]
    2.   start.cmd = "flask run -p 54321"
    3.   start.env_file = ".env"
    复制代码
    如果想要把这个环境变量的文件不仅限于某个命令,而是 pdm run 全局,可以这样配置
    1.  [tool.pdm.scripts]
    2.   _.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
    1.   pdm export -f setuppy -o setup.py
    复制代码
    将 pdm.lock 转成 requirements.txt
    1. pdm export -o requirements.txt
    复制代码
    pycharm 配置支持 PDM
      在命令行创建项目目录,进入项目目录执行init初始化,设置一下pypi源,然后使用pycharm打开这个目录。
    1.  mkdir pdm-demo
    2.   cd pdm-demo
    3.   pdm config pypi.url
    4.   pdm config pypi.url http://mirrors.aliyun.com/pypi/simple –-trusted-host mirrors.aliyun.com
    5.   pdm config pypi.url
    6.   # 永久设置 Linux下
    7.   ? vi ~/.pip/pip.conf
    8.   [global]
    9.   index-url=https://mirrors.aliyun.com/pypi/simple/
    10.   [install]
    11.   trusted-host=mirrors.aliyun.com
    12.   # 使用 pdm 安装一个包:
    13.   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 解释器路径
    1. ? pdm info
    2.   PDM version:        1.15.0
    3.   Python Interpreter: /Users/allenjol/.local/pipx/venvs/pdm/bin/python (3.10)
    4.   Project Root:       /Users/allenjol/Documents/Codes/pdm-demo
    5.   Project Packages:   /Users/allenjol/Documents/Codes/pdm-demo/__pypackages__/3.10
    复制代码
    pycharm设置 Python Interpreter 路径和pdm info 出来的一样即可。
      关于PDM的使用介绍到这里就结束了,看完后是不是觉得它很强大,也很有用。赶紧去试试吧!












    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-5-11 05:34 , Processed in 0.060800 second(s), 23 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表