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环境然后使用下载命令做测试哦

  • 26
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值