geekdoc-python-zh/docs/askpython/pipenv-python-packaging-too...

283 lines
7.0 KiB
Markdown
Raw Permalink Normal View History

2024-10-20 12:24:46 +08:00
# pipenv:Python 的新打包工具
> 原文:<https://www.askpython.com/python/pipenv-python-packaging-tool>
每当我们编写某种程序时,我们也利用[外部库和包](https://www.askpython.com/python/benefits-of-learning-python)来避免重新发明轮子。我们还需要确保程序在不同的环境中正确执行。因此,我们需要某种以有组织的方式管理需求的配置文件。
## pipenv 是什么?
**Pipenv** 是安装 Python 包和使用[虚拟环境](https://www.askpython.com/python/examples/virtual-environments-in-python)的推荐方式。这是因为当我们使用 Python 捆绑的 pip 包管理器时,所有的包都是全局安装的。
我们没有为我们的 Python 项目提供封装的环境,比如用**[【Django】](https://www.askpython.com/django/django-model-forms)****[Flask](https://www.askpython.com/python-modules/flask/flask-crud-application)**创建 web 应用,或者其他一些机器学习项目。
Pipenv 允许我们隔离特定环境中的包。
按照惯例,程序员用 pip 创建一个虚拟环境并在其中安装软件包。但是 pipenv 自动创建和管理一个虚拟环境,并允许我们使用一个 **Pip** **文件**来*添加和删除包*,该文件类似于各种**包管理器**,如 **npm、yarn、composer、**等。
它还生成了非常重要的 **Pipfile.lock** 。这用于产生确定性的构建,这意味着对于每个特定的项目,在 **Pip 文件**中列出的相同版本的包将被用于该特定的项目。
如果项目在任何其他地方运行,比如在生产环境中,或者在云上,或者在不同的机器上,都不会有重大的变化。
## pipenv 试图解决的一些常见问题
* 我们不再需要单独使用 pip 和 virtualenv。
* **requirements.txt** 文件管理起来很麻烦在某些情况下还容易出错。pipenv 使用的 **Pipfile****Pipfile.lock** 更加人性化,易于管理,减少错误。
* Pipenv 自动暴露安全漏洞除此之外pipenv 到处使用**散列值**。
* 它提供了对所有包的依赖图的洞察。
* 通过加载简化开发工作流程。环境文件。
* 它还鼓励使用最新版本的依赖项来最小化过时组件带来的安全风险。
***也读*** : **[*Conda vs Pip:选择你的 Python 包管理器*](https://www.askpython.com/python/conda-vs-pip)**
## 使用 pipenv
* 使用 [pip 命令](https://www.askpython.com/python-modules/python-pip)安装 pipenv:
```py
pip install pipenv
```
### 使用 pip 查找所有包
```py
pip freeze
```
**输出:**
```py
certifi==2022.6.15
distlib==0.3.5
filelock==3.7.1
pep8==1.7.1
pipenv==2022.8.5
platformdirs==2.5.2
PySimpleGUI==4.60.3
virtualenv==20.16.3
virtualenv-clone==0.5.7
```
### 使用 pipenv 创建并激活虚拟环境
```py
pipenv shell
```
这创建了一个包含我们所有依赖项的 **Pipfile** 。让我们看看我们的 Pipfile。
```py
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"
[packages]
[dev-packages]
[requires]
python_version = "3.10"
```
* 查看我们的项目主页信息
```py
pipenv --where # Output: D:\Python
```
* 检查 virtualenv 信息
```py
pipenv --venv # Output: C:\Users\Username\.virtualenvs\Python-hSRNNotQ
```
### 使用 pipenv 安装软件包
```py
pipenv install flask
```
我们的 Pipfile 用包 **flask** 更新了。**“*”**代表烧瓶的**最新版本**。
```py
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"
[packages]
flask = "*"
[dev-packages]
[requires]
python_version = "3.10"
```
我们还可以看到一个 **Pipfile.lock** 文件,它包含了所有的依赖项以及它们的哈希值。这里是锁文件的一瞥。
```py
{
"_meta": {
"hash": {
"sha256": "458ff3b49ddcf0963535dd3aea79b000fa2015d325295d0b04883e31a7adf93e"
},
"pipfile-spec": 6,
"requires": {
"python_version": "3.10"
},
"sources": [
{
"name": "pypi",
"url": "https://pypi.org/simple",
"verify_ssl": true
}
]
},
"default": {
"click": {
"hashes": [
"sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e",
"sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"
],
"markers": "python_version >= '3.7'",
"version": "==8.1.3"
},
```
* 安装特定版本的软件包
```py
pipenv install Django==2.1.1
```
我们的 **Pipfile** 现在
```py
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"
[packages]
flask = "*"
django = "==2.1.1"
[dev-packages]
[requires]
python_version = "3.10"
```
### 使用 pipenv 卸载软件包
```py
pipenv uninstall Django
```
### 项目的开发依赖关系
在编写程序时我们需要一些在开发阶段使用的包。在生产中这些包不再需要以后会被忽略。nose 是 Python 中的一个测试自动化框架,我们将把它作为一个开发依赖项来安装。
```py
pipenv install nose --dev
```
我们的 **Pipfile** 现在
```py
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"
[packages]
flask = "*"
django = "==2.1.1"
[dev-packages]
nose = "*"
[requires]
python_version = "3.10"
```
### **检查已安装软件包中的安全漏洞**
它还有一个专门的命令来检查安全漏洞,并在我们的终端上显示出来,以便解决这些问题。从而使代码更加健壮。
```py
pipenv check
```
### **显示当前安装的依赖图信息**
该命令显示每个包的所有依赖项以及依赖项的所有依赖项。
```py
pipenv graph
```
**输出:**
```py
Django==2.1.1
- pytz [required: Any, installed: 2022.1]
Flask==2.2.2
- click [required: >=8.0, installed: 8.1.3]
- colorama [required: Any, installed: 0.4.5]
- itsdangerous [required: >=2.0, installed: 2.1.2]
- Jinja2 [required: >=3.0, installed: 3.1.2]
- MarkupSafe [required: >=2.0, installed: 2.1.1]
- Werkzeug [required: >=2.2.2, installed: 2.2.2]
- MarkupSafe [required: >=2.1.1, installed: 2.1.1]
nose==1.3.7
```
### **在项目部署前设置锁文件**
*这确保了为当前项目使用* Pipfile.lock 中提供的任何依赖关系,并且还忽略了 Pipfile
```py
# Setup before deployment
pipenv lock
# Ignore Pipfile
pipenv install -ignore-pipfile
```
* 退出当前环境
```py
exit
```
## 摘要
在本文中,我们介绍了设置虚拟环境和使用包来配置使用 pipenv 的定制 Python 项目的通用工作流。
我们还研究了一些核心命令以及它们修改或提供我们的设置信息的方式。对于不同的项目我们需要不同的配置。我们有效地管理了我们的包使得它在不同的地方使用时不会抛出任何错误。Pipenv 确保了我们程序的稳定性,并帮助我们为代码提供一个健壮的结构。
## 参考
[正式文件](https://pypi.org/project/pipenv/)