本文目录导读:

我来详细说明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',
],
},
)
注意事项
- 版本控制:使用语义化版本控制 (MAJOR.MINOR.PATCH)
- 依赖管理:明确指定依赖版本范围
- 文档:提供详细的使用文档和README
- 测试:编写充分的单元测试
- 兼容性:注意Python版本兼容性
- 许可证:选择合适的开源许可证
这个案例涵盖了Python包管理的主要方面,从创建到发布的完整流程。