Python 制作自定义库实践

时间:2024-11-05 07:06:43

版本基于:Python 3.12

0. 前言

随着工具开发的功能日益强大,模块化已经是大势所趋,所以,需要将整个工具项目的公共部分提取并制作为自定义的库。网上很多优秀的文章可以参考,作为小白的笔者结合了自己的实践经验,做一个小结,利己利人~~

1. 准备源码

|----everything
     |----memparser
     |    |----__init__.py
     |    |----log_parser.py
     |    |----log_analyzer.py
     |    |----log_base.py
     |----setup.py
     |----install.bat

代码的层级很重要,其中:

  • 根目录可以是任务的名称,里面包含两个文件:
    • 库名称的文件夹;
    • setup.py 文件;
  • 库文件夹中包含:
    • __init__.py 文件,用以标记其所在的目录是一个package;
    • 源码的 py 文件

注意:

__init__.py 和 setup.py 的名称和层级不能弄错,否则即使后面 pip install 成功,在使用时也无法找到该库。

2. __init__.py 文件

__init__.py 文件在 Python 中有特殊的含义。它的存在标志着其所在的目录是一个 Python 包,这样它就可以被其他脚本导入。

以下是 __init__.py 文件的主要用途:

  • 包的初始化:当导入一个包时,Python 会自动执行 __init__.py 文件中的所有*代码。你可以在这个文件中执行所有需要在包初始化时进行的操作。
  • 控制导入:你可以在 __init__.py 文件中定义一个名为 __all__ 的列表,来指定当用户使用 from package import * 语句时,应该导入哪些模块。
  • 简化导入:如果你的包的结构很深,__init__.py 文件可以用来方便地导入深层模块。例如,在 __init__.py 文件中导入深层模块,用户就可以直接通过 import package.module 的方式导入,而不需要 import package.subpackage.module
  • 包的文档字符串__init__.py 文件的文档字符串通常用作包的文档,help() 函数会显示它。

注意,从 Python 3.3 开始,__init__.py 文件不再是必需的,Python 3.3 引入了隐式的命名空间包,这允许你创建包而无需 __init__.py 文件。然而,如果你需要执行特定的包初始化代码,或者需要使用上述提到的 __all__ 变量,你仍然需要 __init__.py 文件。

更多可以查看:The '__init__.py' File: What Is It? How to Use It? (Complete Guide)

3. setup.py 文件

setup.py 是 Python 库的构建脚本,它是 Python 的标准库 setuptools 的一部分。这个文件用于定义库的元数据,如名称、版本、作者、许可证等,以及库的依赖关系和打包设置。

以下是 setup.py 文件的基本结构:

from setuptools import setup, find_packages

setup(
    name='your-package-name',
    version='0.1.0',
    author='Your Name',
    author_email='your.email@example.com',
    description='A short description of your project',
    long_description=open('README.md').read(),
    long_description_content_type='text/markdown',
    url='https://github.com/yourusername/your-package-name',
    packages=find_packages(),
    classifiers=[
        'Programming Language :: Python :: 3',
        'License :: OSI Approved :: MIT License',
    ],
    install_requires=[
        'numpy',
        'pandas',
        # other libraries your project depends on
    ],
)
  • name 是你的包的名称。
  • version 是你的包的版本号。
  • author 和 author_email 是你的名字和电子邮件地址。
  • description 是你的项目的简短描述。
  • long_description 是你的项目的长描述,通常从 README 文件中读取。
  • long_description_content_type 指定长描述的格式,通常是 ‘text/markdown’ 或 ‘text/rst’。
  • url 是你的项目的主页,通常是 GitHub 仓库的 URL。
  • packages 是你的包中的模块,find_packages() 函数会自动找到它们。
  • classifiers 是一组标记,用于描述你的项目,如支持的 Python 版本、许可证等。
  • install_requires 是你的项目的依赖列表,setuptools 会在安装你的包时自动安装这些依赖。

当你运行 python setup.py install 命令时,setuptools 会读取 setup.py 文件,然后编译、构建和安装你的包。你也可以使用 python setup.py sdist bdist_wheel 命令来创建源代码分发和二进制分发,这些分发可以上传到 PyPI,让其他人通过 pip install 命令安装你的包。

4. 安装

cmd 到setup.py 所在的目录,运行命令:

pip install .

在第一节的目录结构中有个install.bat,可以自动安装:

for /d %%i in (*.egg-info) do (
	if exist "%%i" (
		rd /s /q "%%i"
	)
)

if exist build (
	rd /s /q build
)

pip install .

pause

5. 上传PyPI

全称 Python Package Index,它是 Python 的包管理系统。用户可以通过 PyPI 下载和安装 Python 包,也可以将自己开发的包上传到 PyPI,供其他人使用。

更多可以参考:https://zhuanlan.zhihu.com/p/60836179