README_zh.md 6.9 KB
Newer Older
F
Frost Ming 已提交
1 2
<div align="center">

F
frostming 已提交
3 4 5 6
# PDM - Python Development Master

一个现代的 Python 包管理器,支持 PEP 582。[English version README](README.md)

7
![PDM logo](https://github.com/pdm-project/pdm/blob/main/docs/docs/assets/logo_big.png)
F
Frost Ming 已提交
8

F
Frost Ming 已提交
9 10 11
[![Docs](https://img.shields.io/badge/Docs-mkdocs-blue?style=for-the-badge)](https://pdm.fming.dev)
[![Twitter Follow](https://img.shields.io/twitter/follow/pdm_project?label=get%20updates&logo=twitter&style=for-the-badge)](https://twitter.com/pdm_project)
[![Discord](https://img.shields.io/discord/824472774965329931?label=discord&logo=discord&style=for-the-badge)](https://discord.gg/CEUwAmYm)
F
Frost Ming 已提交
12

F
Frost Ming 已提交
13
![Github Actions](https://github.com/pdm-project/pdm/workflows/Tests/badge.svg)
F
frostming 已提交
14
![PyPI](https://img.shields.io/pypi/v/pdm?logo=python&logoColor=%23cccccc)
F
Frost Ming 已提交
15
[![Docker Cloud Build Status](https://img.shields.io/docker/cloud/build/pdm-project/pdm)](https://hub.docker.com/r/pdm-project/pdm)
F
Frost Ming 已提交
16 17
[![Downloads](https://pepy.tech/badge/pdm)](https://pepy.tech/project/pdm)
[![Downloads](https://pepy.tech/badge/pdm/week)](https://pepy.tech/project/pdm)
F
Frost Ming 已提交
18
[![pdm-managed](https://img.shields.io/badge/pdm-managed-blueviolet)](https://pdm.fming.dev)
F
frostming 已提交
19

F
Frost Ming 已提交
20
[![asciicast](https://asciinema.org/a/jnifN30pjfXbO9We2KqOdXEhB.svg)](https://asciinema.org/a/jnifN30pjfXbO9We2KqOdXEhB)
F
Frost Ming 已提交
21

F
Frost Ming 已提交
22
</div>
F
frostming 已提交
23 24 25

## 这个项目是啥?

F
Frost Ming 已提交
26
PDM 旨在成为下一代 Python 软件包管理工具。它最初是为个人兴趣而诞生的。如果你觉得 `pipenv` 或者
F
frostming 已提交
27 28 29
`poetry` 用着非常好,并不想引入一个新的包管理器,那么继续使用它们吧;但如果你发现有些东西这些
工具不支持,那么你很可能可以在 `pdm` 中找到。

30
PEP 582 提出下面这种项目的目录结构:
31 32 33 34 35 36 37 38 39 40 41 42 43

```
foo
    __pypackages__
        3.8
            lib
                bottle
    myscript.py
```

项目目录中包含一个`__pypackages__`目录,用来放置所有依赖的库文件,就像`npm``node_modules`一样。
你可以在[这里](https://www.python.org/dev/peps/pep-0582/#specification)阅读更多提案的细节。

F
frostming 已提交
44
## 主要特性
F
Frost Ming 已提交
45 46 47 48

- PEP 582 本地项目库目录,支持安装与运行命令,完全不需要虚拟环境。
- 一个简单且相对快速的依赖解析器,特别是对于大的二进制包发布。
- 兼容 PEP 517 的构建后端,用于构建发布包(源码格式与 wheel 格式)
F
Frost Ming 已提交
49
- 具备一个完备的插件系统
F
Frost Ming 已提交
50
- PEP 621 元数据格式
F
frostming 已提交
51 52

## 为什么不用虚拟环境?
F
Frost Ming 已提交
53

F
frostming 已提交
54 55 56 57 58 59 60 61 62 63 64
现在大部分的 Python 包管理器也同时管理虚拟环境,这主要是为了隔离项目开发环境。但如果涉及到虚拟
环境嵌套虚拟环境的时候,问题就来了:你可能用一个虚拟环境的 Python 安装了某个虚拟环境管理工具,
然后又用这个工具去创建更多虚拟环境。当某一天你升级了新版本的 Python 你必须一个一个去检查这些
虚拟环境,没准哪个就用不了了。

然而 PEP 582 提供了一个能把 Python 解释器和项目开发环境解耦的方法。这是一个相对比较新的提案,
没有很多相关的工具实现它,这其中就有 [pyflow]。但 pyflow 又是用 Rust 写的,不是所有 Python 的社区
都会用 Rust,这样就没法贡献代码,而且,基于同样的原因,pyflow 并不支持 PEP 517 构建。

## 安装:

F
Frost Ming 已提交
65 66
PDM 需要 Python 3.7 或更高版本。

67 68 69 70 71 72 73
如果你使用的是 MacOS 并且安装了`homebrew`:

```bash
$ brew install pdm
```

否则,强烈推荐把 `pdm` 安装在一个隔离环境中, 用 `pipx` 是坠吼的。
F
Frost Ming 已提交
74

F
frostming 已提交
75 76 77
```bash
$ pipx install pdm
```
F
Frost Ming 已提交
78

F
frostming 已提交
79 80 81 82 83 84
或者你可以将它安装在用户目录下:

```bash
$ pip install --user pdm
```

F
Frost Ming 已提交
85
## 快速上手
F
frostming 已提交
86

F
Frost Ming 已提交
87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
**初始化一个新的 PDM 项目**

```bash
$ pdm init
```

按照指引回答提示的问题,一个 PDM 项目和对应的`pyproject.toml`文件就创建好了。

**把依赖安装到 `__pypackages__` 文件夹中**

```bash
$ pdm add requests flask
```

你可以在同一条命令中添加多个依赖。稍等片刻完成之后,你可以查看`pdm.lock`文件看看有哪些依赖以及对应版本。

**在 PEP 582 加持下运行你的脚本**

假设你在`__pypackages__`同级的目录下有一个`app.py`脚本,内容如下(从 Flask 的官网例子复制而来):

```python
from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello World!'

if __name__ == '__main__':
    app.run()
```

119
如果你使用的是 Bash,可以通过执行`eval $(pdm --pep582)`设置环境变量,现在你可以用你最熟悉的 **Python 解释器** 运行脚本了:
F
Frost Ming 已提交
120 121 122 123 124 125 126 127 128

```bash
$ python /home/frostming/workspace/flask_app/app.py
 * Serving Flask app "app" (lazy loading)
 ...
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
```

当当当当!你已经把应用运行起来了,而它的依赖全被安装在一个项目独立的文件夹下,而我们完全没有创建虚拟环境。
129 130

如果你是 Windows 用户,请参考[文档](https://pdm.fming.dev/#enable-pep-582-globally)获取设置的方法。
F
Frost Ming 已提交
131

F
Frost Ming 已提交
132
如果你好奇这是如何实现的,可以查看[文档](https://pdm.fming.dev/usage/project/#how-we-make-pep-582-packages-available-to-the-python-interpreter),有一个简短的解释。
F
frostming 已提交
133

F
Frost Ming 已提交
134 135 136 137 138
## 常见问题

### 1. `__pypackages__` 里都包含什么?

PEP 582 尚处于草案阶段,还需要补充很多细节,比如提案中并未说明可执行程序应该如何存放。PDM 会把 `bin`(可执行程序), `include`(头文件),
S
shidenggui 已提交
139
以及 `lib` 都放在 `__pypackages__/X.Y` 下面。
F
Frost Ming 已提交
140 141 142 143 144 145 146

### 2. 如何运行 `__pypackages__` 下的可执行程序?

推荐的方式是在你的命令前面加上 `pdm run`, 你也可以直接运行 `bin` 下面的可执行程序。PDM 的安装器已经在可执行程序里面注入了本地包路径了。

### 3. 使用 PDM 时会载入哪些三方库路径?

F
Frost Ming 已提交
147
本项目的 `__pypackages__` 中的包会在系统的`site-packages`之前被载入,这样能更好地隔离包的环境。
F
Frost Ming 已提交
148

S
shidenggui 已提交
149
### 4. 我能把 `__pypackages__` 保存下来用来部署到别的机器上吗?
F
Frost Ming 已提交
150

S
shidenggui 已提交
151
最好别这样搞,`__pypackages__` 下面安装的包是和操作系统相关的,所以除非是纯 Python 的包,都会有兼容性的问题。你应该把 `pdm.lock`
F
Frost Ming 已提交
152 153
纳入版本管理,然后在目标环境中执行 `pdm sync`

F
frostming 已提交
154
### 5. 我能用`pdm`管理一个 Python 2.7 的项目吗?
F
Frost Ming 已提交
155

F
frostming 已提交
156 157
当然可以。只是`pdm`本身的安装需要 Python 版本高于 3.7,它并不限制项目使用的 Python 版本。

F
Frost Ming 已提交
158 159 160 161 162
## 徽章

在 README.md 中加入以下 Markdown 代码,向大家展示项目正在使用 PDM:

```markdown
F
Frost Ming 已提交
163
[![pdm-managed](https://img.shields.io/badge/pdm-managed-blueviolet)](https://pdm.fming.dev)
F
Frost Ming 已提交
164 165
```

F
Frost Ming 已提交
166
[![pdm-managed](https://img.shields.io/badge/pdm-managed-blueviolet)](https://pdm.fming.dev)
F
Frost Ming 已提交
167

F
Frost Ming 已提交
168
## 鸣谢
F
frostming 已提交
169 170 171 172 173 174

本项目的受到 [pyflow] 与 [poetry] 的很多启发。

[pyflow]: https://github.com/David-OConnor/pyflow
[poetry]: https://github.com/python-poetry/poetry

F
Frost Ming 已提交
175
## 使用许可
F
Frost Ming 已提交
176

F
frostming 已提交
177
本项目基于 MIT 协议开源,具体可查看 [LICENSE](LICENSE)