loading...
Setup的书写
发表于:2025-04-21 |
字数统计: 1.5k | 阅读时长: 6分钟 | 阅读量:

setup相关

PyPI官网:https://pypi.org/

安装setuptools,Twine

1
pip install setuptools twine

setuptools 用于打包代码。
twine 用于上传包到 PyPI。

假设结构目录为此

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
my_project/
├── setup.py # 包含 my_project 配置
├── your_package/ # 这是你的包
├── my_package/ # 一级目录
│ ├── __init__.py
│ ├── module1.py
│ └── module2.py

├── mycli/ # 二级目录
│ ├── __init__.py # 标识 mycli 是一个包
│ ├── utils.py # 其他工具函数模块
│ └── mycli2/ # 子目录 cli,包含 cli 相关的代码
│ ├── __init__.py # 标识 cli 是一个子包
│ └── cli.py # 具体的命令行工具实现

└── tests/
├── __init__.py
└── test_module.py

当任意文件夹如:my_package下,有__init__.py时,该文件夹会被认为是一个包,即可以使用

1
2
3
import my_package

my_package.main()

一级目录my_package

module1.py测试写法

1
2
3
4
# my_package/module1.py

def main():
print("Hello from module1!")

init.py简单写法

1
2
3
4
# my_package/__init__.py
from .module1 import main

__version__ = "0.1.0" #表示版本信息

二级目录mycli

cli.py测试写法

1
2
3
4
# mycli/mycli2/cli.py

def main():
print("Hello from cli!")

一级__init__.py简单写法

1
2
3
4
5
6
# mycli/__init__.py

from .mycli2.cli import main # 从二级包 mycli2 的 cli 模块中导入 main 函数

# 可选:你还可以定义版本信息等
__version__ = "0.1.0"

setup语法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
from setuptools import setup, find_packages

setup(
# 必填元数据
name="your-package-name", # 包名(PyPI 上的名称)
version="0.1.0", # 版本号(遵循语义化版本,如 1.0.0)
packages=find_packages(), # 自动发现所有包(包含 __init__.py 的目录)

# 可选元数据
author="Your Name", # 作者
author_email="your@email.com", # 作者邮箱
description="A short description of your package", # 项目简介
long_description=open("README.md").read(), # 详细描述(通常读 README)
long_description_content_type="text/markdown", # README 格式
url="https://github.com/yourusername/your-package", # 项目主页
license="MIT", # 许可证类型(如 "Apache 2.0", "GPLv3")

classifiers=[ # 分类信息,是为了让 PyPI 更好地展示你的包信息,让用户更容易通过 搜索、筛选、阅读 找到你的包
"Programming Language :: Python :: 3",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
],

# 依赖管理
install_requires=[ # 生产环境依赖
"requests>=2.25.0",
"git+https://github.com/username/repo.git@branch_name#egg=numpy==1.20.0", # 此外,install_requires 还可以指定其他 Python 包或是来自 GitHub、GitLab 或其他源的包。例如,安装一个 GitHub 上的包:
],
extras_require={ # 可选依赖,需要用户调用指令才能安装
"dev": ["pytest>=6.0", "black"], # pip install -e .[dev]
"gui": ["pyqt5>=5.15"],
},

# 入口点(命令行工具)
entry_points={ # 如果你有命令行工具,可以通过这个指定入口
"console_scripts": [ # 注册命令行可执行命令
"module1_hello=my_package.module1:main", # 格式:命令=模块:函数,一级目录
"mycli_hello=mycli.mycli2.cli:main", # 格式:命令=模块:函数,二级目录
],
},

# 包含非 Python 文件(如数据、配置文件)
python_requires='>=3.6', # Python 版本要求
include_package_data=True, # 如果有额外的文件需要打包,设置为 True,告诉 setuptools 包含 MANIFEST.in 中的额外文件
package_data={ # 直接指定包内数据文件
"your_package": ["data/*.json"],
},
zip_safe=False, # 如果不能被压缩成 .egg 文件,设置为 False (暂不清楚)
)

install_requires最小依赖安装

1
pip install -e .

entry_points命令行入口

1
2
3
4
5
6
7
# 入口点(命令行工具)
entry_points={ # 如果你有命令行工具,可以通过这个指定入口
"console_scripts": [ # 注册命令行可执行命令
"module1_hello=my_package.module1:main", # 格式:命令=模块:函数,一级目录
"mycli_hello=mycli.mycli2.cli:main", # 格式:命令=模块:函数,二级目录
],
},

终端输入

1
2
module1_hello
#输出Hello from module1!

在执行完之后运行entry_points内的方法module1_hello,setup同级下的my_package文件夹,module1.py中的main函数

extras_require可选依赖

安装单个依赖

1
pip install -e .[dev]

安装多个依赖

1
pip install -e .[dev,gui]

MANIFEST.in文件

MANIFEST.in 是一个清单文件,它告诉 setuptools 在打包过程中应包括哪些额外文件。如果你没有显式地指定 MANIFEST.in 文件,setuptools 会默认只包括.py文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
# MANIFEST.in

# 包含所有的 .txt 文件
include *.txt

# 包含 my_package 目录下的所有 .json 文件
recursive-include my_package *.json

# 包含模板文件
recursive-include templates *

# 排除掉某些特定文件(例如测试文件)
exclude tests/*

代码打包上传

在根目录下

1
python setup.py sdist bdist_wheel

生成文件

1
2
3
dist/
├── my_project-0.1.tar.gz # 源代码包
└── my_project-0.1-py3-none-any.whl # 二进制包

确保你有一个 PyPI 账户(如果没有,可以在 PyPI 官网 创建一个账户)
上传 dist/ 文件夹中的所有包到 PyPI。

1
twine upload dist/*

如果是第一次上传,twine 会要求你输入 PyPI 账号的用户名和密码。

提示输入

1
2
Enter your username: <your_username>
Enter your password: <your_password>

上传成功后,你的包就会在 PyPI 上上线,其他人就可以通过 pip install 安装你的包了。
你可以访问 PyPI 网站,搜索你的包,确认它是否已经上线。例如,假设你发布的包名是 my_project,你可以访问:
https://pypi.org/project/my_project/

包的安装

网络安装

1
pip install your_package

从网络拉取your_package.tar.gz或者your_package.whl,文件到本地文件夹,随后进行本地安装

本地安装

使用pip安装

1
2
pip install ./your_package.tar.gz
pip install ./your_package.whl

手动安装.tar.gz 包
如果是widndows最好在电脑内安装wsl环境之后进行wsl解压

1
2
3
tar -xzvf package.tar.gz
cd package
python setup.py install

这将会安装包并将其添加到Python环境中,即site-package
如果包有依赖项,pip 会尝试自动解决这些依赖问题,但如果你手动安装 .tar.gz 包,你可能需要自己安装依赖项。

已安装的包

查找已安装的包

通过pip查看

1
pip show requests  #pip show <package_name>

显示包的详情属性,例如:

1
2
3
4
5
6
7
8
Name: requests
Version: 2.25.0
Summary: Python HTTP for Humans.
Home-page: https://requests.readthedocs.io
Author: Kenneth Reitz
Author-email: me@kennethreitz.org
License: Apache 2.0
Location: /path/to/your/python/env/lib/pythonX.Y/site-packages

通过代码字段查看

1
2
import requests
print(requests.__file__)
上一篇:
关于高版本keil5缺少AC5编译器并安装
下一篇:
Uniapp的安装