← 返回主页

第10课: 包管理与虚拟环境

什么是包管理?

Python使用pip作为包管理工具,用于安装、升级和管理第三方库。

pip基础命令

安装包

# 安装最新版本
pip install requests

# 安装指定版本
pip install requests==2.28.0

# 安装最低版本
pip install requests>=2.28.0

# 从requirements.txt安装
pip install -r requirements.txt

# 升级包
pip install --upgrade requests

# 卸载包
pip uninstall requests

查看已安装的包

# 列出所有已安装的包
pip list

# 显示包的详细信息
pip show requests

# 检查哪些包需要升级
pip list --outdated

# 导出已安装的包
pip freeze > requirements.txt

requirements.txt

用于记录项目依赖的文件。

# requirements.txt示例
requests==2.28.0
numpy>=1.21.0
pandas==1.5.3
flask>=2.0.0,<3.0.0
django~=4.2.0  # 兼容版本

# 安装所有依赖
pip install -r requirements.txt

虚拟环境

虚拟环境为每个项目创建独立的Python环境,避免包版本冲突。

使用venv创建虚拟环境

# 创建虚拟环境
python -m venv myenv

# 激活虚拟环境
# Windows:
myenv\Scripts\activate

# macOS/Linux:
source myenv/bin/activate

# 退出虚拟环境
deactivate

虚拟环境工作流程

# 1. 创建项目目录
mkdir myproject
cd myproject

# 2. 创建虚拟环境
python -m venv venv

# 3. 激活虚拟环境
source venv/bin/activate  # macOS/Linux
# 或
venv\Scripts\activate  # Windows

# 4. 安装依赖
pip install requests flask

# 5. 导出依赖
pip freeze > requirements.txt

# 6. 开发项目...

# 7. 退出虚拟环境
deactivate

virtualenv

功能更强大的虚拟环境工具。

# 安装virtualenv
pip install virtualenv

# 创建虚拟环境
virtualenv myenv

# 指定Python版本
virtualenv -p python3.9 myenv

# 激活和使用与venv相同

pipenv

结合了pip和virtualenv的现代包管理工具。

# 安装pipenv
pip install pipenv

# 创建虚拟环境并安装包
pipenv install requests

# 安装开发依赖
pipenv install --dev pytest

# 激活虚拟环境
pipenv shell

# 运行命令
pipenv run python script.py

# 查看依赖树
pipenv graph

# 生成requirements.txt
pipenv requirements > requirements.txt

Pipfile示例

[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"

[packages]
requests = "*"
flask = ">=2.0.0"

[dev-packages]
pytest = "*"
black = "*"

[requires]
python_version = "3.9"

poetry

现代化的Python依赖管理和打包工具。

# 安装poetry
curl -sSL https://install.python-poetry.org | python3 -

# 创建新项目
poetry new myproject

# 初始化现有项目
poetry init

# 添加依赖
poetry add requests

# 添加开发依赖
poetry add --dev pytest

# 安装所有依赖
poetry install

# 运行脚本
poetry run python script.py

# 激活虚拟环境
poetry shell

# 构建包
poetry build

# 发布到PyPI
poetry publish

pyproject.toml示例

[tool.poetry]
name = "myproject"
version = "0.1.0"
description = "项目描述"
authors = ["Your Name "]

[tool.poetry.dependencies]
python = "^3.9"
requests = "^2.28.0"
flask = "^2.0.0"

[tool.poetry.dev-dependencies]
pytest = "^7.0.0"
black = "^22.0.0"

[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"

conda

Anaconda的包管理器,适合数据科学项目。

# 创建环境
conda create -n myenv python=3.9

# 激活环境
conda activate myenv

# 安装包
conda install numpy pandas matplotlib

# 从conda-forge安装
conda install -c conda-forge scikit-learn

# 列出环境
conda env list

# 导出环境
conda env export > environment.yml

# 从文件创建环境
conda env create -f environment.yml

# 删除环境
conda env remove -n myenv

# 退出环境
conda deactivate

最佳实践

常见问题解决

pip安装速度慢

# 使用国内镜像源
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple requests

# 永久配置镜像源
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

权限问题

# 使用--user安装到用户目录
pip install --user requests

# 或使用虚拟环境(推荐)

依赖冲突

# 使用pip check检查冲突
pip check

# 使用pipdeptree查看依赖树
pip install pipdeptree
pipdeptree

项目结构示例

myproject/
├── venv/                 # 虚拟环境(不提交到git)
├── src/
│   ├── __init__.py
│   └── main.py
├── tests/
│   └── test_main.py
├── requirements.txt      # 生产依赖
├── requirements-dev.txt  # 开发依赖
├── .gitignore
└── README.md

.gitignore示例

# 虚拟环境
venv/
env/
ENV/
.venv

# Python缓存
__pycache__/
*.py[cod]
*$py.class

# 分发/打包
dist/
build/
*.egg-info/

# IDE
.vscode/
.idea/
*.swp

练习

  1. 创建一个新项目,设置虚拟环境并安装requests和flask
  2. 导出项目依赖到requirements.txt
  3. 创建一个新的虚拟环境,从requirements.txt安装依赖
  4. 使用pip list查看已安装的包,并升级其中一个包
练习答案:
# 练习1:创建项目和虚拟环境
mkdir myproject
cd myproject
python -m venv venv
source venv/bin/activate  # macOS/Linux
pip install requests flask

# 练习2:导出依赖
pip freeze > requirements.txt

# 查看requirements.txt内容
cat requirements.txt

# 练习3:新环境安装依赖
cd ..
mkdir newproject
cd newproject
python -m venv venv
source venv/bin/activate
pip install -r ../myproject/requirements.txt

# 练习4:查看和升级包
pip list
pip show requests
pip install --upgrade requests
pip list  # 查看升级后的版本