Skip to content

Python 包与 PyPI 详解:打造你的第一个 Python 模块

在 Python 的世界里,包 (package) 就像乐高积木,将功能相关的模块组合在一起,形成一个更大的、更有用的整体。可以把包理解为包含了 __init__.py 文件的文件夹,这个文件告诉 Python 解释器,该文件夹应该被视为一个包。包让代码更有组织性、更易于维护,也方便了代码的复用。

更进一步,如果这个包或者一系列的包被设计成可以被其他人使用,并且通过例如 PyPI (Python Package Index)——Python 官方的第三方软件包仓库——发布,那么它通常被称为库 (library)。所以,库本质上就是可以重复使用的代码集合,通常由多个相互协作的包构成。

举个例子,假设我们要开发一个名为 online_shop 的包,用于管理在线商店的各种功能,比如商品管理、用户认证、订单处理等等。 那么它的结构可能如下所示:

online_shop/          # 包目录 (顶层包)
    __init__.py      # 初始化文件 (可以为空,但建议保留)
    products.py      # 商品管理模块
    users.py         # 用户认证模块
    orders.py        # 订单处理模块
    utils/           # 子包目录
        __init__.py  # 子包初始化文件
        helpers.py   # 辅助函数模块
        validators.py# 数据验证模块

在这个例子中,online_shop 是一个顶层包,包含了 products.pyusers.pyorders.py 等模块。同时,它还包含了一个名为 utils 的子包,用于存放一些辅助性的模块,比如 helpers.pyvalidators.py

注意: 虽然 "包" 和 "库" 这两个术语经常被互换使用,但它们之间还是存在一些细微的差别。一般来说,包指的是一个包含 __init__.py 文件的目录,而库则指的是一组相关功能的集合,通常由多个包组成。

__init__.py 文件的作用

__init__.py 文件是 Python 包的关键组成部分。它有以下几个作用:

  • 标识包: 告诉 Python 解释器该目录是一个包。
  • 初始化包: 可以在其中编写初始化代码,在包被导入时执行,例如:导入子模块、定义包级别的变量等。
  • 简化导入: 可以通过在 __init__.py 中导入子模块,使得用户可以使用更简洁的方式导入模块,例如:可以将 from online_shop.products import Product 放在 __init__.py 中,用户就可以直接使用 from online_shop import Product 来导入 Product 类。

如何创建你的第一个 Python 包?

下面我们来一步步创建一个简单的 Python 包:

  1. 创建项目目录: 首先,创建一个用于存放包文件的目录,例如 my_package

    bash
    mkdir my_package
    cd my_package
  2. 添加 __init__.py 文件:my_package 目录下创建一个空的 __init__.py 文件。

    bash
    touch __init__.py
  3. 创建模块文件:my_package 目录下创建你的 Python 模块文件,例如 my_module.py

    bash
    touch my_module.py

    并在 my_module.py 文件中编写一些简单的代码,例如:

    python
    # my_module.py
    def greet(name):
      """向指定的人打招呼"""
      return f"Hello, {name}!"
  4. (可选) 添加子包: 如果需要,可以在 my_package 中创建子目录(例如 subpackage),并在该子目录中也创建一个 __init__.py 文件和相应的模块文件。 假设我们创建一个 utils 子包,并在其中添加一个 math_utils.py 模块:

    bash
    mkdir utils
    cd utils
    touch __init__.py
    touch math_utils.py

    然后在 math_utils.py 中编写一些简单的数学函数:

    python
    # utils/math_utils.py
    def add(x, y):
      """返回两个数的和"""
      return x + y
  5. 使用包: 现在,你就可以在你的项目中导入并使用你的包了。 例如,在你的项目中的另一个 Python 文件中,你可以这样导入并使用 my_module.py 中的 greet 函数:

    python
    # main.py
    from my_package import my_module
    
    message = my_module.greet("World")
    print(message)  # 输出: Hello, World!

    如果想使用 utils 子包中的 add 函数,可以这样导入:

    python
    # main.py
    from my_package.utils import math_utils
    
    result = math_utils.add(5, 3)
    print(result)  # 输出: 8

发布你的包到 PyPI

如果你想将你的包分享给其他人使用,你可以将它发布到 PyPI 上。 这需要一些额外的步骤,包括:

  1. 创建 setup.pypyproject.toml 文件: 用于描述你的包的信息,例如:包名、版本号、作者、依赖等等。
  2. 构建分发包: 使用 setuptoolsbuild 等工具将你的包打包成 .tar.gz.whl 格式的文件。
  3. 注册 PyPI 账号: 在 PyPI 官网上注册一个账号。
  4. 上传你的包: 使用 twine 工具将你的分发包上传到 PyPI。

这些步骤相对比较复杂,超出了本教程的范围。你可以参考 PyPI 的官方文档了解更多信息。