O gerenciador de pacotes Python que marcou época - mecanismo de cache PDM

Catálogo da Série PDM

1. O gerenciador de pacotes Python que fez época: tutorial PDM - introdutório
2. O gerenciador de pacotes Python que fez época: tutorial PDM - o princípio
3. O gerenciador de pacotes Python que fez época - configuração local e global do PDM
4. A criação de época Gerenciador de pacotes Python - projeto PDM local e global
5. O gerenciador de pacotes Python que marcou época - mecanismo de cache PDM
6. O leitor perguntou: Como fazer o PyCharm suportar PDM?


pdm introduziu o diretório de pacotes local do pep 582, e muitas pessoas estão questionando: cada projeto está em seu próprio diretório de projetos, qual é a diferença entre isso e o ambiente virtual venv?

Muitas pessoas não têm um conhecimento profundo de ambiente virtual e pep 582, então é normal ter essa dúvida.

Em primeiro lugar, a primeira diferença é que o ambiente virtual tem seu próprio interpretador Python, enquanto o pep 582 não adiciona um novo interpretador Python, então o pep 582 é mais leve.

Então, a segunda diferença é nosso conteúdo principal hoje, o suporte do mecanismo de cache pdm.

Se vários projetos pdm dependerem do mesmo pacote python da mesma versão, em circunstâncias normais, cada projeto salvará uma cópia em seu próprio __pypackages__diretório .

Mas há vários problemas com isso:

  1. desperdício de espaço em disco
  2. A instalação é lenta

Você pode pensar que os discos são o hardware mais barato agora, e não importa se você os desperdiça, mas alguns projetos Python têm pacotes mais dependentes do que você pode imaginar. Por exemplo, OpenStack, o maior projeto Python do mundo, tem milhares de Mesmo que você não se sinta mal com seu disco, seu tempo deve ser precioso, certo?

Você cria um novo projeto pdm, e precisa reinstalar tantos pacotes dependentes, e não consegue fazer isso em um dia, então você saberá a importância do cache.

1. Ative o cache

pdm 默认是关闭 cache 的,如有需要,可以通过如下命令进行开启

$ pdm config install.cache on

复制代码

与缓存相关的配置有三个

  • install.cache:是否开启缓存
  • install.cache_method:选择连接缓存的方式
  • cache_dir:指定缓存的存放目录

关于 cache_dir 如无特殊需要,可以不用管,用默认的目录即可

/Users/iswbm/Library/Caches/pdm

复制代码

比较难以理解的,值得一讲的是 install.cache_method,它的值有两种:

  • symlink:以软链接的方式连接
  • pth:以 pth 的方式连接

关于它们的区别,我在后边有详细的讲解,请继续往下

2. 简单示例

这边以一个简单的示例,让你了解缓存的工作原理。

首先我创建两个 pdm 项目

# 初始化第一个 pdm 项目
mkdir pdm-demo1 && cd pdm-demo1
pdm init


# 初始化第二个 pdm 项目
mkdir pdm-demo2 && cd pdm-demo2
pdm init

复制代码

在 pdm-demo1 下,安装 typer 的包

pdm add typer

复制代码

然后进入 python 交互式解释器,试着导入一下,查看导入的 typer 包路径是什么?

可以发现,存放的目录正是 cache_dir 所配置的目录

然后进入 pdm-demo2 下,同样安装 typer 包

pdm add typer

复制代码

同样进入 python 交互式解释器,试着导入一下,查看导入的 typer 包路径是什么?

可以发现,导入的 typer 与之前 pdm-demo1 的路径一致,说明这两个项目用的同一个 typer 包,避免了同个包同个版本的重复安装。

3. 缓存的原理

关于缓存原理,其实并不难,对于不同的 install.cache_method 原理也不一样

cache_method=symlink

symlink 是默认的连接方式,也是最好理解的一种方式。

当你安装了 typer 包后,在本地包目录下就可以看到 typer 通过一个软链接的方式指向了缓存目录下的 typer 包

cache_method=pth

对于 .pth 相信有不少人不清楚它的用法和原理,这里简单提一下。

Quando o Python estiver percorrendo o diretório do arquivo de biblioteca conhecido, se encontrar um arquivo .pth, ele adicionará o caminho registrado no arquivo à configuração sys.path, para que a biblioteca especificada no arquivo .pth também possa ser usada pelo Python Runtime encontrado.

Concentre-se novamente no pdm, se você usar o modo cache_method=pth, toda vez que você instalar um pacote, um .ptharquivo , que registra o diretório lib do pacote a ser armazenado em cache.

Dessa forma, quando o Python procura pacotes no __pypackages__diretório , ao encontrar um .ptharquivo, ele adicionará o caminho registrado no .ptharquivo ao sys.path.

No exemplo acima, olhando para o __pypackages__diretório , você pode descobrir que existem muitos arquivos aaa_xxx.pth, e o conteúdo desses arquivos é o diretório lib do pacote correspondente em nosso diretório de cache

4. Gerenciamento de cache

A ajuda do comando para o cache de gerenciamento do pdm é a seguinte

  • pdm cache clear: limpa todos os caches
  • pdm cache info: Veja todas as informações de cache
  • pdm remove [padrão]: remove o arquivo correspondente
  • pdm cache list: lista todos os arquivos wheel no cache

Acho que você gosta

Origin juejin.im/post/7086101465206358053
Recomendado
Clasificación