本文目录导读:

我来详细说明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包管理的主要方面,从创建到发布的完整流程。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播