【AI生成-待整理】python 包管理方式
·
在 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 作为主要配置方式。
更多推荐



所有评论(0)