2023-01-19 09:28:51 +08:00
|
|
|
|
---
|
|
|
|
|
title: pipenv
|
|
|
|
|
description: Python pipenv 虚拟环境
|
|
|
|
|
keywords:
|
2023-11-09 17:30:33 +08:00
|
|
|
|
- Python
|
|
|
|
|
- pipenv
|
|
|
|
|
- 虚拟环境
|
2023-01-19 09:28:51 +08:00
|
|
|
|
tags:
|
2023-11-09 17:30:33 +08:00
|
|
|
|
- Python/虚拟环境
|
2024-04-26 21:42:22 +08:00
|
|
|
|
- 技术/程序语言
|
2023-01-19 09:28:51 +08:00
|
|
|
|
author: 7Wate
|
|
|
|
|
date: 2023-01-18
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## 简介
|
|
|
|
|
|
2023-12-14 22:21:12 +08:00
|
|
|
|
Pipenv 是 Python 官方推荐的包管理和虚拟环境工具。它结合了 pip 和 virtualenv 的功能,提供了一种简单且高效的方式来管理项目的依赖和环境。
|
2023-01-19 09:28:51 +08:00
|
|
|
|
|
2023-12-14 22:21:12 +08:00
|
|
|
|
Pipenv 主要旨在为应用程序的用户和开发人员提供一种简单的方法来**实现一致的工作项目环境**。
|
2023-01-19 09:28:51 +08:00
|
|
|
|
|
2023-12-14 22:21:12 +08:00
|
|
|
|
### 特性
|
2023-01-19 09:28:51 +08:00
|
|
|
|
|
2023-12-14 22:21:12 +08:00
|
|
|
|
1. **自动管理虚拟环境**:Pipenv 自动创建和管理虚拟环境,简化了环境配置过程。
|
|
|
|
|
2. **声明式依赖文件**:Pipfile 易于阅读和编辑,更加人性化。
|
|
|
|
|
3. **依赖锁定**:Pipfile.lock 确保了在不同环境中依赖版本的一致性。
|
|
|
|
|
4. **安全性检查**:集成了安全性检查功能,可以检测依赖中的安全漏洞。
|
|
|
|
|
5. **环境变量隔离**:通过支持 `.env` 文件,Pipenv 提供了一种简单的环境变量管理方法。
|
2023-01-19 09:28:51 +08:00
|
|
|
|
|
2023-12-14 22:21:12 +08:00
|
|
|
|
## 安装
|
2023-01-19 09:28:51 +08:00
|
|
|
|
|
2023-12-14 22:21:12 +08:00
|
|
|
|
Pipenv 可以通过 pip 安装在不同的操作系统上,推荐使用最新版的 pip 和 Python 以确保兼容性。安装命令如下:
|
2023-01-19 09:28:51 +08:00
|
|
|
|
|
2023-12-14 22:21:12 +08:00
|
|
|
|
```shell
|
|
|
|
|
# 在 macOS 上
|
|
|
|
|
$ brew install pipenv
|
2023-01-19 09:28:51 +08:00
|
|
|
|
|
2023-12-14 22:21:12 +08:00
|
|
|
|
# 在 Windows 上
|
|
|
|
|
$ pip install --user pipenv
|
2023-01-19 09:28:51 +08:00
|
|
|
|
|
2023-12-14 22:21:12 +08:00
|
|
|
|
# 在 Linux 上
|
|
|
|
|
$ pip3 install --user pipenv
|
|
|
|
|
```
|
2023-01-19 09:28:51 +08:00
|
|
|
|
|
2023-12-14 22:21:12 +08:00
|
|
|
|
注意:在 Windows 系统上,可能需要将用户二进制目录添加到环境变量。在 Linux 系统上,建议使用 `pip3` 以确保 Python 3 的兼容性。
|
2023-01-19 09:28:51 +08:00
|
|
|
|
|
2023-12-14 22:21:12 +08:00
|
|
|
|
## 基本概念
|
|
|
|
|
|
|
|
|
|
### Pipfile
|
|
|
|
|
|
|
|
|
|
- `Pipfile`:声明项目所需依赖的文件,类似于 `requirements.txt`,但更易于阅读和维护。
|
|
|
|
|
|
|
|
|
|
### Pipfile.lock
|
2023-01-19 09:28:51 +08:00
|
|
|
|
|
2023-12-14 22:21:12 +08:00
|
|
|
|
- `Pipfile.lock`:锁定依赖版本,确保所有环境中的依赖一致性,防止版本冲突。
|
2023-01-19 09:28:51 +08:00
|
|
|
|
|
2023-12-14 22:21:12 +08:00
|
|
|
|
### 常用流程
|
|
|
|
|
|
|
|
|
|
```mermaid
|
|
|
|
|
graph LR
|
|
|
|
|
A[开始] --> B[克隆/创建项目]
|
2023-12-22 21:20:43 +08:00
|
|
|
|
B --> C[安装依赖]
|
|
|
|
|
C --> D[添加包]
|
|
|
|
|
D --> E[更新全部依赖]
|
|
|
|
|
E --> F[更新特定包]
|
|
|
|
|
F --> G[检查过时包]
|
|
|
|
|
G --> H[确定虚拟环境路径]
|
|
|
|
|
H --> I[激活 Pipenv shell]
|
2023-01-19 09:28:51 +08:00
|
|
|
|
```
|
|
|
|
|
|
2023-12-14 22:21:12 +08:00
|
|
|
|
``````shell
|
|
|
|
|
# 1.克隆或创建项目仓库
|
|
|
|
|
cd your_project_directory
|
2023-01-19 09:28:51 +08:00
|
|
|
|
|
2023-12-14 22:21:12 +08:00
|
|
|
|
# 2.安装依赖使用 pipenv sync 安装 Pipfile.lock 中的依赖
|
|
|
|
|
pipenv sync
|
2023-01-19 09:28:51 +08:00
|
|
|
|
|
2023-12-14 22:21:12 +08:00
|
|
|
|
# 3.添加包并更新依赖
|
|
|
|
|
pipenv install <package>
|
|
|
|
|
|
|
|
|
|
# 4.更新所有包
|
|
|
|
|
pipenv update
|
2023-01-19 09:28:51 +08:00
|
|
|
|
|
2023-12-14 22:21:12 +08:00
|
|
|
|
# 更新特定包
|
|
|
|
|
pipenv update <package>
|
2023-01-19 09:28:51 +08:00
|
|
|
|
|
2023-12-14 22:21:12 +08:00
|
|
|
|
# 检查过时的包
|
|
|
|
|
pipenv update --outdated
|
|
|
|
|
|
|
|
|
|
# 获取虚拟环境的路径
|
|
|
|
|
pipenv --venv
|
|
|
|
|
|
|
|
|
|
# 激活 Pipenv shell 虚拟环境
|
2023-01-19 09:28:51 +08:00
|
|
|
|
pipenv shell
|
2023-12-14 22:21:12 +08:00
|
|
|
|
``````
|
2023-01-19 09:28:51 +08:00
|
|
|
|
|
2023-12-14 22:21:12 +08:00
|
|
|
|
## 基本操作
|
|
|
|
|
|
|
|
|
|
### 创建虚拟环境
|
2023-01-19 09:28:51 +08:00
|
|
|
|
|
2023-12-14 22:21:12 +08:00
|
|
|
|
创建一个新的项目时,Pipenv 会自动为你创建一个虚拟环境。运行以下命令来创建一个新的项目:
|
2023-01-19 09:28:51 +08:00
|
|
|
|
|
|
|
|
|
```shell
|
2023-12-14 22:21:12 +08:00
|
|
|
|
mkdir myproject
|
|
|
|
|
cd myproject
|
|
|
|
|
pipenv install
|
|
|
|
|
```
|
2023-01-19 09:28:51 +08:00
|
|
|
|
|
2023-12-14 22:21:12 +08:00
|
|
|
|
这会创建一个 `Pipfile` 和一个空的虚拟环境。
|
2023-01-19 09:28:51 +08:00
|
|
|
|
|
2023-12-14 22:21:12 +08:00
|
|
|
|
### 安装和同步依赖
|
2023-01-19 09:28:51 +08:00
|
|
|
|
|
2023-12-14 22:21:12 +08:00
|
|
|
|
- 安装依赖:`pipenv install [package]`
|
2023-01-19 09:28:51 +08:00
|
|
|
|
|
2023-12-14 22:21:12 +08:00
|
|
|
|
```
|
|
|
|
|
# 例如,安装 requests
|
|
|
|
|
pipenv install requests
|
|
|
|
|
```
|
2023-01-19 09:28:51 +08:00
|
|
|
|
|
2023-12-14 22:21:12 +08:00
|
|
|
|
这会自动将 `requests` 添加到 `Pipfile` 并更新 `Pipfile.lock`。
|
2023-01-19 09:28:51 +08:00
|
|
|
|
|
2023-12-14 22:21:12 +08:00
|
|
|
|
- 同步环境:`pipenv sync`
|
|
|
|
|
|
|
|
|
|
使用 `pipenv sync` 可以快速同步项目环境,例如:
|
2023-01-19 09:28:51 +08:00
|
|
|
|
|
2023-12-14 22:21:12 +08:00
|
|
|
|
```shell
|
|
|
|
|
# 根据 Pipfile.lock 安装依赖
|
|
|
|
|
pipenv sync
|
|
|
|
|
```
|
2023-01-19 09:28:51 +08:00
|
|
|
|
|
2023-12-14 22:21:12 +08:00
|
|
|
|
## 常用命令
|
|
|
|
|
|
|
|
|
|
| 命令 | 用途 |
|
|
|
|
|
| ---------------------------------- | ------------------------------------------------ |
|
|
|
|
|
| pipenv install | 安装项目所需的包 |
|
2023-12-22 21:20:43 +08:00
|
|
|
|
| pipenv install --python [version] | 安装项目指定的 python 版本(使用 pyenv) |
|
2023-12-14 22:21:12 +08:00
|
|
|
|
| pipenv install [package] | 安装特定的包 |
|
|
|
|
|
| pipenv install --dev [package] | 安装用于开发环境的包 |
|
|
|
|
|
| pipenv uninstall [package] | 卸载特定的包 |
|
|
|
|
|
| pipenv lock | 生成锁定文件,确保项目在不同环境中的包版本一致性 |
|
|
|
|
|
| pipenv sync | 根据 Pipfile.lock 安装所有依赖,确保与锁文件一致 |
|
|
|
|
|
| pipenv update | 更新项目中的所有包 |
|
|
|
|
|
| pipenv update [package] | 更新特定的包 |
|
|
|
|
|
| pipenv install --ignore-pipfile | 忽略 Pipfile,根据 Pipfile.lock 安装依赖 |
|
|
|
|
|
| pipenv install --selective-upgrade | 升级指定的依赖并更新 Pipfile.lock 文件 |
|
|
|
|
|
| pipenv check | 检查项目中的包是否有安全漏洞 |
|
|
|
|
|
| pipenv verify | 校验 Pipfile.lock 中的哈希是否最新 |
|
|
|
|
|
| pipenv graph | 展示项目依赖关系图 |
|
|
|
|
|
| pipenv clean | 删除虚拟环境中无用的包 |
|
|
|
|
|
| pipenv shell | 启动虚拟环境的 shell |
|
|
|
|
|
| pipenv run [command] | 在虚拟环境中运行命令 |
|
|
|
|
|
| pipenv --venv | 显示虚拟环境的位置 |
|
|
|
|
|
| pipenv --py | 显示虚拟环境中 Python 解释器的位置 |
|
|
|
|
|
| pipenv --where | 显示项目文件的位置 |
|
|
|
|
|
| pipenv --rm | 删除虚拟环境 |
|
|
|
|
|
|
|
|
|
|
## 高级操作
|
|
|
|
|
|
|
|
|
|
### 自动安装 Python
|
|
|
|
|
|
|
|
|
|
Pipenv 可以与 pyenv 结合使用,自动安装所需的 Python 版本。这在你的系统中没有安装特定版本的 Python 时非常有用。
|
|
|
|
|
|
|
|
|
|
示例代码:
|
2023-01-19 09:28:51 +08:00
|
|
|
|
|
2023-12-14 22:21:12 +08:00
|
|
|
|
```shell
|
|
|
|
|
# 假设你的 Pipfile 需要 Python 3.6,但系统中没有安装
|
|
|
|
|
# 当运行 pipenv install 时,它会提示是否使用 pyenv 安装 Python 3.6
|
|
|
|
|
pipenv install
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### 自动加载 `.env` 文件
|
|
|
|
|
|
|
|
|
|
Pipenv 会自动从 `.env` 文件加载环境变量。这对于管理配置和密钥非常有用,尤其是在生产环境中。
|
|
|
|
|
|
|
|
|
|
```shell
|
|
|
|
|
# 假设你有一个 .env 文件包含如下内容
|
|
|
|
|
HELLO=WORLD
|
2023-01-19 09:28:51 +08:00
|
|
|
|
|
2023-12-14 22:21:12 +08:00
|
|
|
|
# 当运行 pipenv shell 或 pipenv run 时,它会加载这些环境变量
|
|
|
|
|
pipenv run python main.py
|
2023-01-19 09:28:51 +08:00
|
|
|
|
```
|
|
|
|
|
|
2023-12-14 22:21:12 +08:00
|
|
|
|
### 自定义虚拟环境位置
|
|
|
|
|
|
|
|
|
|
通过设置 `WORKON_HOME` 环境变量,你可以自定义 Pipenv 创建虚拟环境的位置。
|
2023-01-19 09:28:51 +08:00
|
|
|
|
|
|
|
|
|
```shell
|
2023-12-14 22:21:12 +08:00
|
|
|
|
# 将虚拟环境存储在特定位置
|
|
|
|
|
export WORKON_HOME=~/.venvs
|
|
|
|
|
```
|
2023-01-19 09:28:51 +08:00
|
|
|
|
|
2023-12-14 22:21:12 +08:00
|
|
|
|
### 使用 Pipenv 进行测试
|
2023-01-19 09:28:51 +08:00
|
|
|
|
|
2023-12-14 22:21:12 +08:00
|
|
|
|
Pipenv 与 Travis CI 和 tox 等测试框架结合使用,可以维护一致的测试环境。
|
2023-01-19 09:28:51 +08:00
|
|
|
|
|
2023-12-14 22:21:12 +08:00
|
|
|
|
示例 Travis CI 配置:
|
2023-01-19 09:28:51 +08:00
|
|
|
|
|
2023-12-14 22:21:12 +08:00
|
|
|
|
```yaml
|
|
|
|
|
language: python
|
|
|
|
|
python:
|
|
|
|
|
- "3.6"
|
|
|
|
|
install:
|
|
|
|
|
- pip install pipenv
|
|
|
|
|
- pipenv install --dev
|
|
|
|
|
script:
|
|
|
|
|
- pipenv run pytest
|
2023-01-19 09:28:51 +08:00
|
|
|
|
```
|
|
|
|
|
|
2023-12-14 22:21:12 +08:00
|
|
|
|
## Pipfile Vs setup.py
|
|
|
|
|
|
|
|
|
|
理解 Pipfile 和 setup.py 之间的区别。Pipfile 用于应用程序,而 setup.py 用于库。
|
|
|
|
|
|
|
|
|
|
示例 Pipfile:
|
|
|
|
|
|
|
|
|
|
```markdown
|
|
|
|
|
[[source]]
|
|
|
|
|
url = "https://pypi.python.org/simple"
|
|
|
|
|
verify_ssl = true
|
|
|
|
|
|
|
|
|
|
[packages]
|
|
|
|
|
requests = "*"
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
示例 setup.py:
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
from setuptools import setup
|
|
|
|
|
|
|
|
|
|
setup(
|
|
|
|
|
name='your_package',
|
|
|
|
|
version='0.1',
|
|
|
|
|
install_requires=[
|
|
|
|
|
'requests',
|
|
|
|
|
]
|
|
|
|
|
)
|
|
|
|
|
```
|