在 Python 项目中,处理依赖管理通常涉及 requirements.txt 和 setup.py。以下是详细的处理方式和最佳实践:

1. requirements.txt 的使用

基本格式

txt

Django==3.2.0
requests>=2.25.0
numpy<1.20.0
flask

安装依赖

bash

pip install -r requirements.txt

生成 requirements.txt

bash

# 生成当前环境的所有包
pip freeze > requirements.txt

# 只生成项目直接依赖(推荐使用 pip-tools)
pip install pip-tools
pip-compile requirements.in

2. setup.py 的使用

基本结构

python

from setuptools import setup, find_packages

setup(
    name="myproject",
    version="0.1.0",
    packages=find_packages(),
    install_requires=[
        "Django==3.2.0",
        "requests>=2.25.0",
        "numpy<1.20.0",
    ],
    extras_require={
        "dev": [
            "pytest>=6.0",
            "black",
            "flake8",
        ],
        "docs": [
            "sphinx",
            "sphinx-rtd-theme",
        ]
    },
    python_requires=">=3.7",
)

安装项目

bash

# 安装项目及其依赖
pip install .

# 开发模式安装(可编辑模式)
pip install -e .

# 安装额外依赖组
pip install -e ".[dev]"
pip install -e ".[dev,docs]"

3. 现代化配置:pyproject.toml

推荐使用 pyproject.toml 作为现代 Python 项目的标准配置:

toml

[build-system]
requires = ["setuptools>=45", "wheel"]
build-backend = "setuptools.build_meta"

[project]
name = "myproject"
version = "0.1.0"
dependencies = [
    "Django==3.2.0",
    "requests>=2.25.0",
    "numpy<1.20.0",
]

[project.optional-dependencies]
dev = ["pytest>=6.0", "black", "flake8"]
docs = ["sphinx", "sphinx-rtd-theme"]

[tool.setuptools.packages.find]
where = ["src"]

4. 最佳实践和工具

使用 pip-tools 管理依赖

bash

# 安装 pip-tools
pip install pip-tools

# 创建 requirements.in 文件
echo "Django>=3.2.0" > requirements.in
echo "requests>=2.25.0" >> requirements.in

# 编译生成 requirements.txt
pip-compile requirements.in

# 更新依赖
pip-compile --upgrade requirements.in

# 同步安装
pip-sync requirements.txt

requirements.in 示例

txt

Django>=3.2.0
requests>=2.25.0
numpy<1.20.0
flask

分层依赖管理

txt

# requirements.txt
-c requirements_prod.txt
-r requirements_dev.txt

# requirements_prod.txt
Django==3.2.0
requests>=2.25.0

# requirements_dev.txt
pytest>=6.0
black
flake8

5. 自动化构建脚本示例

build.py 脚本

python

#!/usr/bin/env python3
import subprocess
import sys
from pathlib import Path

def run_command(cmd, check=True):
    """运行 shell 命令"""
    print(f"Running: {cmd}")
    result = subprocess.run(cmd, shell=True, capture_output=True, text=True)
    if check and result.returncode != 0:
        print(f"Error: {result.stderr}")
        sys.exit(result.returncode)
    return result

def install_dependencies():
    """安装项目依赖"""
    if Path("requirements.txt").exists():
        print("Installing from requirements.txt...")
        run_command("pip install -r requirements.txt")
    elif Path("pyproject.toml").exists():
        print("Installing from pyproject.toml...")
        run_command("pip install -e .")
    else:
        print("No dependency file found")

def run_tests():
    """运行测试"""
    print("Running tests...")
    run_command("pytest")

def build_package():
    """构建分发包"""
    print("Building package...")
    run_command("python -m build")

if __name__ == "__main__":
    install_dependencies()
    run_tests()
    build_package()

使用 Makefile

makefile

.PHONY: install test build clean

install:
	pip install -r requirements.txt

install-dev:
	pip install -r requirements-dev.txt

test:
	pytest

build:
	python -m build

clean:
	rm -rf build/ dist/ *.egg-info/
	find . -type f -name "*.pyc" -delete
	find . -type d -name "__pycache__" -delete

6. 完整项目结构示例

text

myproject/
├── pyproject.toml
├── requirements.in
├── requirements.txt
├── setup.py (可选)
├── src/
│   └── myproject/
│       ├── __init__.py
│       └── main.py
├── tests/
│   └── test_main.py
└── Makefile

7. 环境特定的依赖

使用环境变量

python

# build.py
import os

def get_requirements_file():
    env = os.getenv("ENVIRONMENT", "dev")
    return f"requirements-{env}.txt"

def install_environment_deps():
    req_file = get_requirements_file()
    if Path(req_file).exists():
        run_command(f"pip install -r {req_file}")

条件安装

python

# setup.py
import sys

extra_deps = []
if sys.version_info < (3, 8):
    extra_deps.append("importlib-metadata")

setup(
    install_requires=[
        "requests>=2.25.0",
        *extra_deps
    ]
)

选择哪种方式取决于你的项目需求:

  • 简单项目: 使用 requirements.txt

  • 库/包项目: 使用 setup.py 或 pyproject.toml

  • 复杂项目: 结合使用 pyproject.toml + requirements.txt 用于开发

现代 Python 项目推荐使用 pyproject.toml 作为主要配置方式。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐