文件setup.py

主要内容包括:

1. 项目元数据
    项目的基本信息,如名称、版本、作者、作者邮箱、描述、URL 等
2. 项目依赖关系
    该项目运行所需的第三方库列表,通常以 install_requires 列出
3. 项目打包
    配置如何将项目打包为可分发的形式,包括指定包所在的目录、数据文件、脚本等
4. 项目入口点
    定义执行入口,指示安装后如何启动或使用该项目
5. 额外依赖
    用于指定额外的依赖,例如开发依赖、测试依赖等

示例:

from setuptools import setup, find_packages
 
# 指定变量
requirements = (here / "requirements.txt").read_text(encoding="utf-8").splitlines()
extras_require = {
    "selenium": ["selenium>4", "webdriver_manager", "beautifulsoup4"],
    "search-google": ["google-api-python-client==2.94.0"],
}
extras_require["test"] = [
    *set(i for j in extras_require.values() for i in j),
    "pytest",
]
 
setup(
    # 1. 项目元数据
    name="my_project",
    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/my_project",
 
 
    # 2. 项目依赖关系(自动安装的依赖库)
    install_requires=[
        "requests>=2.20.0",
        "numpy>=1.18.0",
    ],
    # install_requires=requirements,
 
 
    # 3. 项目打包
    packages=find_packages(),
    # packages=find_packages(exclude=["contrib", "docs", "examples", "tests*"]),
    # packages=find_packages(include=['sample', 'sample.*']),
    # packages=["asmk",],   # 指定要打包的 Python 包。这里只打包了 asmk 文件夹下的内容。
 
 
    # package_data: 用于指定与代码相关联的额外文件,例如配置文件、模板、静态资源等
    # 这些文件在打包时会被包括在内。它的格式是一个字典,键是包的名称,值是要包含的文件列表
    package_data={
        "my_project": ["data/*.csv"],  # 包含数据文件,例如 CSV 文件
    },
    # 如果设为 True,则在打包时会包括源代码控制系统中被标记的所有文件
    include_package_data=True,
    # 尽管配置 package_data 足以满足大多数需求,但在某些情况下,您可能需要将数据文件放在包之外。
    data_files=[('my_data', ['data/data_file'])],
 
 
    # 4. 项目入口点
    entry_points={
        "console_scripts": [
            "my_command=my_project.module:function",  # 定义命令行入口
        ],
    },
    classifiers=[
        "Programming Language :: Python :: 3",
        "License :: OSI Approved :: MIT License",
        "Operating System :: OS Independent",
    ],
    python_requires='>=3.6',  # 指定 Python 版本要求
 
    # 5. 额外依赖
    extras_require=extras_require,
 
 
    # 声明一个 C 扩展模块,模块名为 asmk.hamming,源码路径是 cython/hamming.c
    ext_modules=[Extension("asmk.hamming", ["cython/hamming.c"])],  # 编译时会生成 .so 或 .pyd 文件供 Python 调用
 
 
 
    # 自定义安装类:InstallWrapper
    #   对默认 install 命令的封装,用于安装前检查是否安装了 faiss
    #       如果找不到 faiss,就提示错误并终止安装。
    #       install.run(self): 如果一切正常,继续执行标准的安装流程。
    class InstallWrapper(install):
        def run(self):
            try:
                import faiss
            except ImportError:
                sys.stderr.write("\nERROR: faiss package not installed\n\n")
                sys.exit(1)
            install.run(self)
 
    # 指定 install 命令时使用我们自定义的 InstallWrapper 类,加入安装前检查逻辑
    cmdclass={"install": InstallWrapper,},   #
 
)

4.项目入口点-entry_points

  • entry_points 是一个字典,键表示入口点的类别,值是一个列表,每个列表项定义一个入口点
  • entry_points 的格式如下:
entry_points = {
    "<category_name>": [
        "<entry_point_1>",
        "<entry_point_2>",
        ...
    ],
    ...
}

category_name是入口点的类别,主要包括:

1. console_scripts:
    用于定义命令行脚本,允许你在安装后创建可在命令行中执行的脚本
2. gui_scripts:
    与 "console_scripts" 类似,但用于图形用户界面 (GUI) 应用程序
    这个入口点会在系统中创建可执行的 GUI 程序,通常在 GUI 环境中运行
3. pytest11:
    用于 pytest 插件
    定义了 pytest 的扩展点,使你可以创建自定义的 pytest 插件

entry_point_X是具体的入口点定义,格式一般为:

<script_name>=<module_name>:<object_name>
说明:
    <script_name> 是入口点的名称
    <module_name> 是 Python 模块的名称
    <object_name> 是模块中的对象或函数

console_scripts

  • 用于命令行脚本
  • 格式:
entry_points = {
    "console_scripts": [
        "<script_name>=<module_name>:<object_name>",
    ],
}

说明:

"console_scripts" 指定了命令行脚本类别
"<script_name>" 是命令行中的命令名称
"<module_name>:<object_name>"
    表示在命令行中执行模块和对应的函数或对象

gui_scripts

  • 用于 GUI 脚本
  • 格式:
entry_points = {
    "gui_scripts": [
        "my_gui_command=my_gui_module:main",
    ],
}

说明:

"gui_scripts" 用于定义 GUI 应用程序入口点。
"my_gui_command" 是命令行中用于启动 GUI 应用程序的命令。
"my_gui_module:main" 指定 GUI 程序的入口函数。

相关