文件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是入口点的类别,主要包括:: 1. console_scripts: 用于定义命令行脚本,允许你在安装后创建可在命令行中执行的脚本 2. gui_scripts: 与 "console_scripts" 类似,但用于图形用户界面 (GUI) 应用程序 这个入口点会在系统中创建可执行的 GUI 程序,通常在 GUI 环境中运行 3. pytest11: 用于 pytest 插件 定义了 pytest 的扩展点,使你可以创建自定义的 pytest 插件 entry_point_X是具体的入口点定义,格式一般为:: =: 说明: 是入口点的名称 是 Python 模块的名称 是模块中的对象或函数 console_scripts --------------- * 用于命令行脚本 * 格式:: entry_points = { "console_scripts": [ "=:", ], } 说明:: "console_scripts" 指定了命令行脚本类别 "" 是命令行中的命令名称 ":" 表示在命令行中执行模块和对应的函数或对象 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 程序的入口函数。 实例 ==== .. literalinclude:: ./files/setup.py.MetaGPT.py