Python代码封装为SDK并上传到PyPI的详细教程(适合新手小白)
在正文开始之前,我们先来了解什么是sdk,SDK
是Software Development Kit的缩写,译为”软件开发工具包
”,通常是为辅助开发某类软件而编写的特定软件包,框架集合等,SDK
一般包含相关文档
,范例
和工具
.
举个例子,有两杯奶茶:
小A的那一杯有根吸管,小B的这一杯没有吸管,这个时候小B就需要借用小A的吸管来喝(这就是sdk的作用)
我们应该怎么去做好sdk的工作呢? 来听我给你大白话描述
首先要创建一个项目目录:
packaging
├── my_project (给自己的功能取个名字——英文)
│ ├── module (功能名称)
│ │ ├── __init__.py (可以理解为你功能的输入和输出也可以为空)
│ │ └── hello.py (功能代码)
│ ├── module2 (和module1一样)
│ │ ├── __init__.py
│ │ └── bye.py
│ ├── __init__.py
│ └── utils.py
├── README.md (解释功能 和 使用方法)
└── setup.py (配置文件)
如果小伙伴们 看不懂以上的信息,下面就是一个完整的流程和用法:
my_project
我可以给我的项目取个名字 比如我要做个文本解析的pypi包那我就可以叫他 文本解析(file_processor)
packaging
├── file_processor (给自己的功能取个名字——英文)
│ ├── module (功能名称)
│ │ ├── __init__.py (可以理解为你功能的输入和输出也可以为空)
│ │ └── hello.py (功能代码)
│ ├── __init__.py
├── README.md (解释功能 和 使用方法)
└── setup.py (配置文件)
my_project \ module
比如我要做pdf解析我们就给他取名字 pdf解析(pdf_processor)
packaging
├── file_processor (给自己的功能取个名字——英文)
│ ├── pdf_processor (功能名称)
│ │ ├── __init__.py (可以理解为你功能的输入和输出也可以为空)
│ │ └── hello.py (功能代码)
│ ├── __init__.py
├── README.md (解释功能 和 使用方法)
└── setup.py (配置文件)
my_project \ module \ hello.py
然后就是将你编写好的python代码放入到你的功能目录里面 取名(processor_pdf)
packaging
├── file_processor (给自己的功能取个名字——英文)
│ ├── pdf_processor (功能名称)
│ │ ├── __init__.py (可以理解为你功能的输入和输出也可以为空)
│ │ └── processor_pdf.py (功能代码)
│ ├── __init__.py
├── README.md (解释功能 和 使用方法)
└── setup.py (配置文件)
举个代码例子:
#python代码
from langchain.document_loaders import PyPDFLoader
from typing import List
def process_pdf(file_path: str) -> List[str]:
loader = PyPDFLoader(file_path)
pages = loader.load_and_split()
return [page.page_content for page in pages]
my_project \ module \ init.py
这个文件就是你 processor_pdf.py代码的输入输出 也可以不写直接为空
举个例子:首先创建两个功能代码 一个是解析的代码,一个是保存的代码
packaging
├── file_processor (给自己的功能取个名字——英文)
│ ├── pdf_processor (功能名称)
│ │ ├── __init__.py (可以理解为你功能的输入和输出也可以为空)
| | ├── read_pdf.py (写一个解析pdf的代码)
| | ├── save.py (写一个保存解析结果的代码)
│ │ └── processor_pdf.py (功能代码)
│ ├── __init__.py
├── README.md (解释功能 和 使用方法)
└── setup.py (配置文件)
read_pdf.py(解析代码)
#调用你的功能代码processor_pdf.py
import os
from .process_pdf import process_pdf
def process_file(file_path: str, save_dir: str) -> str:
_, file_extension = os.path.splitext(file_path)
save_path = os.path.join(save_dir, os.path.basename(file_path) + '.txt')
file_extension.lower() == '.pdf':
content = '\n'.join(process_pdf(file_path))
save_to_txt(content, save_path)
return save_path
#上面就是一个简单的pdf解析代码
save.py(保存代码)
#直接写怎么保存解析后文本的代码就行
def save_to_txt(content: str, save_path: str):
with open(save_path, 'w', encoding='utf-8') as file:
file.write(content)
#这是个简单保存的代码
最后就来解释一下 init.py怎么用
#演示python代码:
from .process_pdf import read_pdf #(调用解析代码read_pdf.py中的process_pdf函数)
from .save_to_txt import save #(调用保存代码save.py中的save_to_txt函数)#以上就是init.py的作用 简单点来说就是把read_pdf代码中的输入拿过来 save.py中的输出拿过来 做的拼接
#当然也可以不写init.py 在你的源码(processor_pdf)中如果有输入 解析 输出 保存 一整个服务链完整就行
现在我们的结构:
packaging
├── file_processor (给自己的功能取个名字——英文)
│ ├── pdf_processor (功能名称)
│ │ ├── __init__.py (可以理解为你功能的输入和输出也可以为空)
| | ├── read_pdf.py (写一个解析pdf的代码)
| | ├── save.py (写一个保存解析结果的代码)
│ │ └── processor_pdf.py (功能代码)
│ ├── __init__.py (可写可不写 功能(module)多的话建议写)
├── README.md (解释功能 和 使用方法)
└── setup.py (配置文件)
README.md(解释说明)
#配置自定义
所需配置:显卡4090
可接受环境:python3.8
需要的导入的包:langchain
功能:解析pdf
怎么用:先解析再保存
效果:嘎嘎好
以上是举得一个例子,还是要按照自己功能的实际情况来定。当然这个是比较简单的readme解释,按照自己功能来写(最终目的用户用的方便,能看懂每一块在做什么)
到了最为关键的一步了 setup.py
#这些就是setup.py的模版 在这只做了个演示 大家可以根据自身实际情况来修改
(可以添加功能说明 也可以自由发挥)
import setuptools
with open("README.md", "r", encoding="utf-8") as fh:
long_description = fh.read()
setuptools.setup(
name="my_project",
version="0.0.1",
author="jiexi",
author_email="jiexi@163.com",
description="A small example package",
long_description=long_description,
long_description_content_type="text/markdown",
url="https://github.com/jckling",
classifiers=[
"Programming Language :: Python :: 3",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
],
packages=setuptools.find_packages(),
python_requires=">=3.6",
)
文件整理编写好之后准备做打包工作
#在打包之前确保setuptools和wheel库是最新的 如果需要更新以下命令可以更新
pip install -U setuptools wheel
准备工作做好之后在终端进入到你的my_project目录中:
#输入以下命令对sdk进行打包:
python setup.py sdist bdist_wheel
打包完成后目录:
packaging
├── dist
│ ├── file_processor-0.0.1.tar.gz
│ ├── file_processor-0.0.1-py3-none-any.whl
├── file_processor
│ ├── pdf_processor
│ │ ├── read_pdf.py
│ │ └── save.py
│ │ ├── __init__.py
│ │ └── processor_pdf.py
│ └── __init__.py
├── packaging.egg-info
├── README.md
└── setup.py
以上工作做完之后就做好了打包 下面就要开始往pypi上传代码了
首先创建一个.pypirc(这就是文件名字不是后缀名),创建好之后放入到你的用户路径中
这是我本地的用户的路径C:\Users\22428
然后右键点击编写内容 将.pypirc内容修改成:
#将.pypirc内容修改成以下内容 your_username和your_password需要替换为在PyPI注册的实际用户名和密码
方法1:
只复制以下信息 其他不用复制
[distutils]
index-servers = pypi[pypi]
repository: https://test.pypi.org/legacy/
username = your_username
password = your_password方法2:
只复制以下信息 其他不用复制
[distutils]
index-servers = pypi[pypi]
repository: https://test.pypi.org/legacy/
username = __token__
password = 你的API令牌
接下来就是上传命令:
#先下载twine
pip install twine
然后进入到file_processor项目的主目录的终端 (与setup.py并齐)如图
在输入最后一条命令你的功能sdk就打包上传好了
twine upload --repository pypi dist/*
结语:这一步结束之后 整个 打包封装sdk流程就结束了,可以重新创建python环境然后使用下载命令做测试哦
作者:白