虚拟环境与最佳实践
翻译整理自 Python Tutorial - Virtual Environments and Packages 与 PEP 8 Style Guide。
1. 为什么需要虚拟环境
不同项目可能依赖同一库的不同版本,全局安装会冲突。虚拟环境隔离每个项目的依赖。
2. 创建虚拟环境
venv(标准库)
python -m venv .venv
.venv\Scripts\activate # Windows
source .venv/bin/activate # macOS / Linux激活后命令行前缀出现 (.venv),python、pip 都指向虚拟环境内的工具。
退出:
deactivatevirtualenv(兼容更多版本)
pip install virtualenv
virtualenv .venv3. 包管理
pip install requests
pip install -r requirements.txt
pip freeze > requirements.txt
pip uninstall requests
pip install --upgrade requests更新 pip:
python -m pip install --upgrade pip4. 现代化工具:uv、poetry
uv(推荐)
Rust 实现,速度极快:
pip install uv
uv venv
uv pip install requests
uv pip compile > requirements.txtpoetry
pip install poetry
poetry new myproject
poetry add requests
poetry install
poetry build5. 包结构建议
PEP 518 / PEP 517 推荐使用 pyproject.toml 作为项目元数据:
myproject/
├── pyproject.toml
├── README.md
├── src/
│ └── myproject/
│ ├── __init__.py
│ └── core.py
└── tests/6. 风格规范 PEP 8
- 缩进 4 空格,不用 Tab
- 一行 79 字符以内(长语句可换行)
- 函数与类之间空两行
- 方法之间空一行
- 命名规范:
- 变量函数:
lowercase_with_underscore - 类:
CamelCase - 常量:
UPPER_CASE - 私有:
_prefix
- 变量函数:
# Good
def calculate_total(items):
return sum(item.price for item in items)
class ShoppingCart:
pass使用 black、ruff、flake8 自动格式化与检查:
pip install black ruff
black .
ruff check .7. 类型注解与 mypy
def add(a: int, b: int) -> int:
return a + b
from typing import List, Dict, Optional
def f(items: List[int], config: Optional[Dict[str, str]] = None) -> None: ...pip install mypy
mypy myproject/Python 3.9+ 可直接用 list[int]、dict[str, int],无需 typing.List。
8. 测试与 CI
pip install pytest
pytest
pytest -v --cov=myprojectCI 配合 pre-commit、black --check、ruff、pytest 在 GitHub Actions 跑。
9. 异步编程 asyncio(3.4+)
import asyncio
async def main():
await asyncio.sleep(1)
print("done")
asyncio.run(main())10. 常见陷阱
- 可变默认参数共享
- 闭包延迟绑定
isvs==(小整数缓存)- 浮点数比较
- 文件未关闭
None与 falsy 混淆
小结
掌握虚拟环境、风格规范、类型注解与测试,即具备工业级 Python 工程能力。