杰瑞科技汇

如何将单个Python文件转为可安装的Python包?

核心概念:什么是 Python 包?

一个 Python 包本质上就是一个包含 __init__.py 文件的目录,这个 __init__.py 文件向 Python 表明,这个目录应该被当作一个包来处理。

如何将单个Python文件转为可安装的Python包?-图1
(图片来源网络,侵删)
  • 简单包:一个目录 + 一个 __init__.py 文件。
  • 包内可以有多个模块:你可以在这个目录里放置多个 .py 文件(模块),以及子包(即包含 __init__.py 的子目录)。

第一步:创建基本的包结构

假设我们有一个简单的 calculator.py 文件,我们想把它变成一个名为 my_calculator 的包。

原始文件结构:

my_project/
└── calculator.py

calculator.py 的内容:

# calculator.py
def add(a, b):
    """返回两个数的和"""
    return a + b
def subtract(a, b):
    """返回两个数的差"""
    return a - b

目标: 我们想通过 my_calculator.add() 来调用这个函数。

如何将单个Python文件转为可安装的Python包?-图2
(图片来源网络,侵删)

操作步骤:

  1. 创建一个目录:将 calculator.py 移动到一个新的目录中,这个目录的名字就是你的包名,my_calculator

  2. 创建 __init__.py 文件:在 my_calculator 目录中,创建一个名为 __init__.py 的空文件,这个文件是包的“身份证”,必不可少。

现在你的项目结构看起来像这样:

my_project/
└── my_calculator/
    ├── __init__.py
    └── calculator.py

__init__.py 的作用:

  • 标识目录为包:这是最基本的作用。
  • 控制包的导入行为:你可以在 __init__.py 中编写代码,来决定当用户 import my_calculator 时,会得到什么。

第二步:让包更易用(推荐做法)

如果我们想使用这个包,我们需要这样做:

import my_calculator.calculator
result = my_calculator.calculator.add(5, 3)
print(result)  # 输出: 8

这有点冗长,我们可以通过修改 __init__.py 来让它更简洁。

修改 my_calculator/__init__.py 文件:

# my_calculator/__init__.py
from .calculator import add, subtract
# 这里的 "." 表示从当前包(my_calculator)中导入

当你导入 my_calculator 时,它会自动将 addsub 函数加载进来。

测试一下:

在你的项目根目录(my_project)下创建一个 main.py 文件来测试:

# main.py
import my_calculator
# 现在可以直接使用 my_calculator.add() 了
result_add = my_calculator.add(10, 2)
print(f"10 + 2 = {result_add}")
result_sub = my_calculator.subtract(10, 2)
print(f"10 - 2 = {result_sub}")

运行 python main.py,你会得到预期的输出。


第三步:进阶实践

一个完整的、可供他人安装的包,通常还需要以下文件:

包含多个模块

一个包通常由多个功能模块组成,我们可以将 calculator.py 拆分成 arithmetic.py(算术)和 geometry.py(几何)。

新的结构:

my_project/
└── my_calculator/
    ├── __init__.py
    ├── arithmetic.py  # 算术模块
    └── geometry.py   # 几何模块

arithmetic.py

# my_calculator/arithmetic.py
def add(a, b):
    return a + b
def subtract(a, b):
    return a - b

geometry.py

# my_calculator/geometry.py
def area_of_circle(radius):
    import math
    return math.pi * radius ** 2

更新 __init__.py 以导入所有模块的公共接口:

# my_calculator/__init__.py
from .arithmetic import add, subtract
from .geometry import area_of_circle

测试:

# main.py
import my_calculator
print(my_calculator.add(5, 3))
print(my_calculator.area_of_circle(10))

添加 setup.py 文件(用于安装你的包)

如果你想将这个包安装到你的 Python 环境中,或者上传到 PyPI,你需要一个 setup.py 文件。

在项目根目录 my_project 下创建 setup.py

# setup.py
from setuptools import setup, find_packages
setup(
    name="my-calculator",  # 包在 PyPI 上的名称
    version="0.1.0",       # 版本号
    author="Your Name",    # 作者
    author_email="your.email@example.com", # 作者邮箱
    description="A simple calculator package", # 简短描述
    long_description=open("README.md").read(), # 详细描述(通常来自 README.md)
    long_description_content_type="text/markdown",
    url="https://github.com/yourusername/my-calculator", # 项目主页
    packages=find_packages(), # 自动查找所有包
    classifiers=[
        "Programming Language :: Python :: 3",
        "License :: OSI Approved :: MIT License",
        "Operating System :: OS Independent",
    ],
    python_requires='>=3.6', # 最低支持的 Python 版本
)

如何使用 setup.py 安装:

  1. 确保你已安装 setuptoolspip install setuptools
  2. my_project 目录下,打开终端,运行:
    pip install -e .
    • -e--editable 表示“可编辑安装”,这意味着你对包源代码的修改会立即生效,无需重新安装,这对于开发非常方便。

安装完成后,你可以在任何地方(只要 Python 环境已激活)直接 import my_calculator,而无需关心它在哪里。

添加 README.mdLICENSE

  • README.md:向其他用户介绍你的包,说明如何安装和使用。
  • LICENSE:声明你的包的许可证(MIT, Apache 2.0),这是开源项目的重要组成部分。

第四步:使用 pyproject.toml(现代标准)

从 Python 3.11 开始,pyproject.toml 是构建和分发包的推荐标准,取代了旧的 setup.py + setup.cfg 方式,它更清晰,是 PEP 517 和 PEP 518 的核心。

创建 pyproject.toml 文件(在项目根目录 my_project 下):

# pyproject.toml
[build-system]
requires = ["setuptools>=61.0"]
build-backend = "setuptools.build_meta"
[project]
name = "my-calculator"
version = "0.1.0"
authors = [
  { name="Your Name", email="your.email@example.com" },
]
description = "A simple calculator package"
readme = "README.md"
requires-python = ">=3.8"
classifiers = [
    "Programming Language :: Python :: 3",
    "License :: OSI Approved :: MIT License",
    "Operating System :: OS Independent",
]
[project.urls]
Homepage = "https://github.com/yourusername/my-calculator"
Issues = "https://github.com/yourusername/my-calculator/issues"

如何使用 pyproject.toml 安装:

安装方式完全相同,pip 会自动识别 pyproject.toml 文件。

pip install -e .

注意: 如果使用 pyproject.toml,通常不再需要 setup.py 文件,除非有非常特殊的构建需求。


从文件到包的完整步骤

  1. 创建目录:将你的 .py 文件放入一个以其功能命名的目录中(my_utils)。
  2. 添加 __init__.py:在目录中创建一个空的 __init__.py 文件,将其标记为 Python 包。
  3. 重构导入:在 __init__.py 中使用 from .module import function 的语法,将包内模块的函数/类暴露出来,简化用户的调用方式。
  4. 组织代码:随着功能增多,在包内创建多个 .py 模块来组织代码。
  5. 添加元数据:创建 setup.pypyproject.toml 文件,定义包的名称、版本、作者等信息,以便安装和分发。
  6. 编写文档:创建 README.md 说明如何使用你的包,LICENSE 文件声明其开源许可。
  7. 安装测试:使用 pip install -e . 进行可编辑安装,并在项目中测试 import 你的包是否成功。

遵循这些步骤,你就可以将一个简单的 Python 文件,发展成一个结构良好、易于维护和分发的专业 Python 包了。

分享:
扫描分享到社交APP
上一篇
下一篇