Python包管理案例如何创建使用

wen python案例 28

本文目录导读:

Python包管理案例如何创建使用

  1. 创建Python包
  2. 安装包
  3. 使用包
  4. 包依赖管理
  5. 测试包
  6. 发布包
  7. 高级包管理技巧
  8. 注意事项

我来详细说明Python包管理的创建和使用案例。

创建Python包

项目结构

my_package/
├── my_package/
│   ├── __init__.py
│   ├── module1.py
│   └── module2.py
├── setup.py
└── README.md

1 创建包文件

my_package/__init__.py

# 包初始化文件
from .module1 import Calculator
from .module2 import StringProcessor
__version__ = "1.0.0"

my_package/module1.py

class Calculator:
    """计算器类"""
    @staticmethod
    def add(a, b):
        return a + b
    @staticmethod
    def subtract(a, b):
        return a - b
    @staticmethod
    def multiply(a, b):
        return a * b
    @staticmethod
    def divide(a, b):
        if b == 0:
            raise ValueError("除数不能为0")
        return a / b

my_package/module2.py

class StringProcessor:
    """字符串处理类"""
    @staticmethod
    def reverse(text):
        return text[::-1]
    @staticmethod
    def count_vowels(text):
        vowels = 'aeiouAEIOU'
        return sum(1 for char in text if char in vowels)
    @staticmethod
    def to_uppercase(text):
        return text.upper()

2 创建setup.py

from setuptools import setup, find_packages
setup(
    name="my_package",
    version="1.0.0",
    author="Your Name",
    author_email="your.email@example.com",
    description="一个示例Python包",
    long_description=open('README.md').read(),
    long_description_content_type="text/markdown",
    url="https://github.com/yourusername/my_package",
    packages=find_packages(),
    classifiers=[
        "Programming Language :: Python :: 3",
        "License :: OSI Approved :: MIT License",
        "Operating System :: OS Independent",
    ],
    python_requires='>=3.6',
    install_requires=[
        # 依赖的第三方包
    ],
)

安装包

1 本地安装

# 在包目录下执行
pip install -e .
# 或者安装到当前环境
python setup.py install

2 上传到PyPI

# 安装上传工具
pip install twine
# 构建包
python setup.py sdist bdist_wheel
# 上传到PyPI
twine upload dist/*

使用包

1 基本使用

# 导入整个包
import my_package
# 使用包中的类
calc = my_package.Calculator()
result = calc.add(10, 5)
print(f"加法结果: {result}")  # 输出: 加法结果: 15
processor = my_package.StringProcessor()
text = "Hello World"
print(processor.reverse(text))  # 输出: dlroW olleH

2 导入特定模块

from my_package.module1 import Calculator
from my_package.module2 import StringProcessor
# 直接使用类
calc = Calculator()
print(calc.multiply(4, 5))  # 输出: 20
proc = StringProcessor()
print(proc.count_vowels("Hello"))  # 输出: 2

3 完整使用示例

# main.py
from my_package import Calculator, StringProcessor
def main():
    """使用包的主函数"""
    # 计算器示例
    print("=== 计算器示例 ===")
    calc = Calculator()
    print(f"10 + 5 = {calc.add(10, 5)}")
    print(f"10 - 5 = {calc.subtract(10, 5)}")
    print(f"10 × 5 = {calc.multiply(10, 5)}")
    print(f"10 ÷ 5 = {calc.divide(10, 5)}")
    # 字符串处理示例
    print("\n=== 字符串处理示例 ===")
    processor = StringProcessor()
    text = "Python Programming"
    print(f"原文: {text}")
    print(f"反转: {processor.reverse(text)}")
    print(f"元音数: {processor.count_vowels(text)}")
    print(f"大写: {processor.to_uppercase(text)}")
if __name__ == "__main__":
    main()

包依赖管理

1 requirements.txt

# 生成requirements.txt
pip freeze > requirements.txt
# 安装依赖
pip install -r requirements.txt

2 Pipfile (Pipenv)

[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"
[packages]
my_package = ">=1.0.0"
numpy = "*"
[dev-packages]
pytest = "*"
black = "*"
[requires]
python_version = "3.8"

测试包

1 单元测试

# tests/test_calculator.py
import pytest
from my_package.module1 import Calculator
class TestCalculator:
    def setup_method(self):
        self.calc = Calculator()
    def test_add(self):
        assert self.calc.add(2, 3) == 5
        assert self.calc.add(-1, 1) == 0
        assert self.calc.add(0, 0) == 0
    def test_divide(self):
        assert self.calc.divide(10, 2) == 5
        assert self.calc.divide(7, 2) == 3.5
        with pytest.raises(ValueError):
            self.calc.divide(10, 0)
    def test_multiply(self):
        assert self.calc.multiply(3, 4) == 12
        assert self.calc.multiply(0, 5) == 0

2 运行测试

# 安装pytest
pip install pytest
# 运行测试
pytest tests/
# 带详细输出
pytest -v tests/

发布包

1 创建发布版本

# 更新版本号
# 在__init__.py中修改__version__
# 清理之前构建的文件
rm -rf dist/ build/ *.egg-info
# 构建新版本
python setup.py sdist bdist_wheel
# 检查包
twine check dist/*

2 发布到PyPI

# 上传到PyPI测试环境
twine upload --repository-url https://test.pypi.org/legacy/ dist/*
# 上传到正式PyPI
twine upload dist/*

高级包管理技巧

1 命名空间包

# 允许跨目录的命名空间包
# namespace_package/__init__.py 可以为空

2 数据文件包含

# setup.py中
from setuptools import setup
setup(
    ...
    package_data={
        'my_package': ['data/*.txt', 'config/*.ini'],
    },
    include_package_data=True,
)

3 入口点设置

# setup.py
setup(
    ...
    entry_points={
        'console_scripts': [
            'my_tool=my_package.cli:main',
        ],
    },
)

注意事项

  1. 版本控制:使用语义化版本控制 (MAJOR.MINOR.PATCH)
  2. 依赖管理:明确指定依赖版本范围
  3. 文档:提供详细的使用文档和README
  4. 测试:编写充分的单元测试
  5. 兼容性:注意Python版本兼容性
  6. 许可证:选择合适的开源许可证

这个案例涵盖了Python包管理的主要方面,从创建到发布的完整流程。

抱歉,评论功能暂时关闭!