虚拟环境与包管理
Python 2.7 的项目依赖管理通过 virtualenv 创建隔离的虚拟环境,配合 pip 安装第三方包。这是避免项目间依赖冲突、保证环境可复现的标准做法。
virtualenv
安装:
pip install virtualenv
创建虚拟环境:
# 创建名为 venv 的虚拟环境
virtualenv venv
# 指定 Python 版本
virtualenv -p /usr/bin/python2.7 venv
# 不复制系统 site-packages(更干净)
virtualenv --no-site-packages venv
激活与退出:
# Linux/macOS
source venv/bin/activate
# Windows
venv\Scripts\activate
# 退出
deactivate
激活后,命令行提示符会显示虚拟环境名称:
(venv) $ python --version
Python 2.7.18
此时 python 和 pip 指向虚拟环境中的版本,安装的包只在当前环境可用。
pip 包管理
安装包:
pip install requests
pip install requests==2.25.1 # 指定版本
pip install "requests>=2.20,<3.0" # 版本范围
pip install -e . # 以开发模式安装当前项目
查看已安装包:
pip list
pip freeze # 适合 requirements.txt 的格式
导出依赖:
pip freeze > requirements.txt
requirements.txt 内容示例:
requests==2.25.1
flask==1.1.4
sqlalchemy==1.4.46
安装依赖:
pip install -r requirements.txt
这是复现环境的标准方式:新机器上创建虚拟环境后,执行 pip install -r requirements.txt 即可安装所有依赖。
requirements.txt 进阶
分类依赖:
# requirements.txt —— 生产依赖
flask==1.1.4
gunicorn==20.1.0
# requirements-dev.txt —— 开发依赖
-r requirements.txt
pytest==4.6.11
mock==3.0.5
flake8==3.9.2
开发时安装:
pip install -r requirements-dev.txt
条件依赖:
# requirements.txt
requests==2.25.1
# Python 2.7 需要旧版本
enum34==1.1.10; python_version < "3.4"
项目结构
典型的 Python 2.7 项目结构:
myproject/
├── venv/ # 虚拟环境(不提交到版本控制)
├── mypackage/ # 主包
│ ├── __init__.py
│ ├── module1.py
│ └── module2.py
├── tests/ # 测试
│ ├── __init__.py
│ ├── test_module1.py
│ └── test_module2.py
├── requirements.txt # 生产依赖
├── requirements-dev.txt # 开发依赖
├── setup.py # 包安装配置
├── README.md
└── .gitignore
.gitignore:
venv/
*.pyc
__pycache__/
*.egg-info/
dist/
build/
setup.py
setup.py 让项目可安装:
from setuptools import setup, find_packages
setup(
name="mypackage",
version="1.0.0",
packages=find_packages(),
install_requires=[
"requests>=2.20",
"flask>=1.1,<2.0",
],
python_requires=">=2.7, !=3.0.*, !=3.1.*",
entry_points={
"console_scripts": [
"myapp=mypackage.cli:main",
],
},
)
安装项目:
pip install -e . # 开发模式(修改代码无需重新安装)
pip install . # 生产安装
实际应用
项目初始化脚本:
#!/bin/bash
# setup.sh
# 创建虚拟环境
virtualenv venv
# 激活
source venv/bin/activate
# 升级 pip
pip install --upgrade pip
# 安装依赖
pip install -r requirements-dev.txt
# 运行测试
python -m unittest discover -v
echo "Setup complete!"
检查依赖冲突:
pip check # 检查依赖兼容性(pip 9.0+)
查看包信息:
pip show requests # 显示包的详细信息
pip show --files requests # 显示包安装的文件
Python 2.7 的特殊考虑
Python 2.7 已于 2020 年停止维护,使用时有以下注意事项:
安全更新:
- 不再接收官方安全补丁
- 生产环境应考虑迁移到 Python 3
- 如果必须使用,确保系统层面的安全隔离
兼容包:
- 许多包已停止支持 Python 2.7
- 安装时可能需要指定旧版本
- 使用
pip install package==version锁定可用版本
常见 Python 2.7 兼容包:
requests==2.27.1 # 最后一个支持 Python 2.7 的版本
flask==1.1.4 # Flask 2.0+ 需要 Python 3.6+
django==1.11.29 # Django 2.0+ 需要 Python 3+
pytest==4.6.11 # pytest 5.0+ 需要 Python 3.5+
迁移准备:
# 安装 future 包,帮助编写兼容代码
pip install future
# 使用 modernize 自动转换
pip install modernize
modernize -w mypackage/
与 conda 的选择
| 特性 | virtualenv + pip | conda |
|---|---|---|
| 包来源 | PyPI | Anaconda 仓库 |
| 非 Python 依赖 | 需手动安装 | 自动管理 |
| 科学计算包 | 可能编译失败 | 预编译二进制 |
| 环境管理 | virtualenvwrapper | conda env |
| 标准性 | Python 官方推荐 | 数据科学领域流行 |
纯 Python 项目推荐 virtualenv + pip。涉及 NumPy、SciPy 等科学计算包时,conda 更方便。