文件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 程序的入口函数。