179 lines
7.5 KiB
Markdown
179 lines
7.5 KiB
Markdown
|
|
# Python Pipenv:另一个包管理器
|
|||
|
|
|
|||
|
|
> 原文:[https://python.land/virtual-environments/pipenv](https://python.land/virtual-environments/pipenv)
|
|||
|
|
|
|||
|
|
Pipenv 是做类似事情的 Python 诗歌的替代品。像诗歌一样,许多人更喜欢 Pipenv 而不是分别安装[pip](https://python.land/virtual-environments/installing-packages-with-pip)和 [virtualenv](https://python.land/virtual-environments/virtualenv) 。由你决定你更喜欢哪种方法。也许你开始在一个团队或开源项目中工作,在那里 pip + virtualenv 是标准;没关系。也许,看完这个,你想说服他们改用 pipenv!然而,如果你还没有这样做,我建议你先看看诗歌。如果你问我,这是更好的选择!
|
|||
|
|
|
|||
|
|
目录
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
* [Pipenv vs virtualenv](#Pipenv_vs_virtualenv "Pipenv vs virtualenv")
|
|||
|
|
* [管道安装](#Pipenv_install "Pipenv install")
|
|||
|
|
* [如何使用 Python pipenv](#How_to_use_Python_pipenv "How to use Python pipenv")
|
|||
|
|
* [Pipenv 是如何工作的?](#How_does_Pipenv_work "How does Pipenv work?")
|
|||
|
|
* [附加 Pipenv 特性](#Additional_Pipenv_features "Additional Pipenv features")
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
## Pipenv vs virtualenv
|
|||
|
|
|
|||
|
|
与单独使用`pip`和`virtualenv `相比,使用 pipenv 作为 Python 包管理器有几个优点。这些是主要的:
|
|||
|
|
|
|||
|
|
* 你不再需要单独使用 pip 和 virtualenv。取而代之的是,你有一个工具可以做所有的事情甚至更多!
|
|||
|
|
* pipenv 将您的顶层依赖项与最后测试的组合(例如,pip 冻结输出)分开。对于开发人员来说,这使得依赖关系管理更加用户友好。
|
|||
|
|
* pipenv 鼓励使用最新版本的依赖项来最小化安全风险。它甚至可以扫描你的依赖已知的漏洞。
|
|||
|
|
* pipenv 通过`pipenv graph`让您深入了解依赖图。
|
|||
|
|
* pipenv 散列所有依赖项。它将检测在您最初将包作为依赖项包含进来之后被篡改的包。
|
|||
|
|
* `pipenv`也可以处理`requirements.txt`文件。如果有,它会自动检测并转换成一个`Pipfile`。
|
|||
|
|
|
|||
|
|
也许这些要点会让你感到困惑。别担心,他们都会解释的!
|
|||
|
|
|
|||
|
|
## 管道安装
|
|||
|
|
|
|||
|
|
我们可以简单地用`pip`来安装`pipenv`:
|
|||
|
|
|
|||
|
|
```py
|
|||
|
|
$ pip install --user pipenv
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
`--user`选项只为本地用户安装 pipenv。如果您使用它,您将确保不会干扰系统范围的包。老实说,我只是全球安装,没有任何问题。如果你得到一个错误,没有找到画中画,尝试`pip3`或`python -m pip`。如果你还有问题,你可能还想查看一下 [Python 安装说明](https://python.land/installing-python)。
|
|||
|
|
|
|||
|
|
如果你在 MacOS 或者 Linux 上,我也可以推荐家酿。去[家酿](https://brew.sh/)网站安装。之后,事情就简单了:
|
|||
|
|
|
|||
|
|
```py
|
|||
|
|
$ brew install pipenv
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 如何使用 Python pipenv
|
|||
|
|
|
|||
|
|
现在您已经安装了 pipenv,让我们来试试吧!
|
|||
|
|
|
|||
|
|
首先,创建一个目录。我把我的叫做`myenv`。现在,将 cd 放入目录,并安装您的第一个 pipenv 依赖项:
|
|||
|
|
|
|||
|
|
```py
|
|||
|
|
$ pipenv install requests
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
接下来发生的是:
|
|||
|
|
|
|||
|
|
* pipenv 检测到还没有虚拟环境,所以它创建了一个。
|
|||
|
|
* 它安装请求。
|
|||
|
|
* 它创建了两个文件:`Pipfile`和`Pipfile.lock`。
|
|||
|
|
|
|||
|
|
下面的截图显示了 pipenv 在我的系统上的运行。
|
|||
|
|
|
|||
|
|
Thank you for reading my tutorials. I write these in my free time, and it requires a lot of time and effort. I use ads to keep writing these *free* articles, I hope you understand! **Support me by disabling your adblocker on my website** or, alternatively, **[buy me some coffee](https://www.buymeacoffee.com/pythonland)**. It's much appreciated and allows me to keep working on this site!
|
|||
|
|
|
|||
|
|
Pipenv 在作者的系统上运行
|
|||
|
|
|
|||
|
|
完成后,您可以选择通过以下方式进入虚拟环境:
|
|||
|
|
|
|||
|
|
```py
|
|||
|
|
$ pipenv shell
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
这是可选的,因为您可以像这样在虚拟环境中直接启动任何命令:
|
|||
|
|
|
|||
|
|
```py
|
|||
|
|
$ pipenv run <your command>
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
例如,要在虚拟环境中启动 Python 脚本:
|
|||
|
|
|
|||
|
|
```py
|
|||
|
|
$ pipenv run python3 myscript.py
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Pipenv 是如何工作的?
|
|||
|
|
|
|||
|
|
我不喜欢黑盒。我想知道发生了什么事。所以我们先来考察一下`Pipfile`。它应该是这样的:
|
|||
|
|
|
|||
|
|
```py
|
|||
|
|
[[source]]
|
|||
|
|
name = "pypi"
|
|||
|
|
url = "https://pypi.org/simple"
|
|||
|
|
verify_ssl = true
|
|||
|
|
[dev-packages]
|
|||
|
|
[packages]
|
|||
|
|
requests = "*"
|
|||
|
|
[requires]
|
|||
|
|
python_version = "3.6"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
如您所见,Pipfile 包含了我们的顶级需求,但没有指定版本号,因为我们没有指定版本号。现在看一下 Pipfile.lock。这是一个很大的文件,所以我在这里只展示一个片段来说明:
|
|||
|
|
|
|||
|
|
```py
|
|||
|
|
...
|
|||
|
|
"requests": {
|
|||
|
|
"hashes": [
|
|||
|
|
"sha256:43999036bfa82904....",
|
|||
|
|
"sha256:b3f43d496c6da..."
|
|||
|
|
],
|
|||
|
|
"index": "pypi",
|
|||
|
|
"version": "==2.23.0"
|
|||
|
|
},
|
|||
|
|
...
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
列出了它的所有依赖项,包括版本号。基本上,这是 pip freeze 输出的高级版本。这些是我们合作过的版本。保证起作用的是一揽子计划的组合。
|
|||
|
|
|
|||
|
|
但是虚拟环境在哪里呢?如果你仔细看@fig:pipenv_in_action 中的截图,你会看到 virtualenv 是在`~/.local/share/virtualenvs/myenv-mAvwj65b/`中创建的。我们也可以用`pipenv --venv`问 pipenv。
|
|||
|
|
|
|||
|
|
因为我们已经熟悉了虚拟环境的结构,所以您会注意到这一个并没有什么不同。它只是位于其他地方,在你的项目结构之外。这样,您就不需要将它从您的版本控制系统中排除。
|
|||
|
|
|
|||
|
|
如果您在另一个位置创建另一个同名的虚拟环境,它将不会被重用。我认为,目录名中的散列是基于到 virtualenv 的路径的。Pipenv 使用它来查找正确的名称,尽管名称重复。
|
|||
|
|
|
|||
|
|
## 附加 Pipenv 特性
|
|||
|
|
|
|||
|
|
让我们看看 Pipenv 区别于普通 pip 和 virtualenvs 的更多特性。
|
|||
|
|
|
|||
|
|
### 分离开发包
|
|||
|
|
|
|||
|
|
使用`pip`,您只能通过使用第二个需求文件(例如`requirements-dev.txt`)将开发需求与生产需求分开。使用`pipenv`,您可以简单地使用`--dev`选项:
|
|||
|
|
|
|||
|
|
```py
|
|||
|
|
$ pipenv install pytest --dev
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
开始为您的项目工作的另一个开发人员可以安装所有需求,包括开发人员需求,使用:
|
|||
|
|
|
|||
|
|
```py
|
|||
|
|
$ pipenv install --dev
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 依赖性管理
|
|||
|
|
|
|||
|
|
尝试安装核心依赖项所需的所有子依赖项。不过,冲突可能会出现。如果包 A 至少需要包 B 的 1.10 版本,而包 C 需要 1.9 版本,那么您就有问题了。`pipenv`不能为你解决,但会就此警告你,默认拒绝继续。它还提供了对您与`pipenv graph`命令的依赖关系的深入了解:
|
|||
|
|
|
|||
|
|
```py
|
|||
|
|
$ pipenv graph
|
|||
|
|
pytest==5.3.5
|
|||
|
|
- attrs [required: >=17.4.0, installed: 19.3.0]
|
|||
|
|
- importlib-metadata [required: >=0.12, installed: 1.5.0]
|
|||
|
|
- zipp [required: >=0.5, installed: 3.1.0]
|
|||
|
|
- more-itertools [required: >=4.0.0, installed: 8.2.0]
|
|||
|
|
- packaging [required: Any, installed: 20.3]
|
|||
|
|
- pyparsing [required: >=2.0.2, installed: 2.4.6]
|
|||
|
|
- six [required: Any, installed: 1.14.0]
|
|||
|
|
- pluggy [required: >=0.12,<1.0, installed: 0.13.1]
|
|||
|
|
- importlib-metadata [required: >=0.12, installed: 1.5.0]
|
|||
|
|
- zipp [required: >=0.5, installed: 3.1.0]
|
|||
|
|
- py [required: >=1.5.0, installed: 1.8.1]
|
|||
|
|
- wcwidth [required: Any, installed: 0.1.8]
|
|||
|
|
requests==2.23.0
|
|||
|
|
- certifi [required: >=2017.4.17, installed: 2019.11.28]
|
|||
|
|
- chardet [required: >=3.0.2,<4, installed: 3.0.4]
|
|||
|
|
- idna [required: >=2.5,<3, installed: 2.9]
|
|||
|
|
- urllib3 [required: >=1.21.1,<1.26,!=1.25.1,!=1.25.0, installed: 1.25.8]
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 安全漏洞的检测
|
|||
|
|
|
|||
|
|
`pipenv`可以扫描您的包中的安全漏洞。它通过使用`safety`包来实现。输入:
|
|||
|
|
|
|||
|
|
```py
|
|||
|
|
$ pipenv check
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
并且`pipenv`会扫描你的依赖图,寻找有已知安全漏洞的包!
|