经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Python » 查看文章
一文搞懂如何自己写一个Python库
来源:cnblogs  作者:FangZheng  时间:2024/3/7 9:10:54  对本文有异议

一文搞懂如何自己写一个Python库

你是否曾想过为自己的Python项目编写一个库,以便在不同项目中重复使用代码?

并且能在PyPI仓库中发布,并通过pip install 库名来安装使用

1.png

编写Python库可能看起来有些复杂,但实际上并非如此。本文将为你提供一份简明的指南,带你逐步了解如何编写自己的Python库。

文章共分以下部分:

  1. 准备工作
  2. 创建项目
  3. 编写代码
  4. 添加库的文档和注释
  5. 测试你的库
  6. 发布到PyPI测试仓库
  7. 发布到PyPI官方仓库
  8. 通过pip安装测试使用
  9. 总结

一、准备工作

1.1 注册PyPI账号

  • https://test.pypi.org/平台上自己注册一个账号,用于测试发布的库

  • https://pypi.org/平台上自己注册一个账号,用于正式发布库

1.2 为你的库取个好听的名字

在开始编写之前,你需要明确你的库将要实现的功能以及它的使用场景。并为你的库取一个好听好记的名字,这有助于确保你的库能够满足用户的需求,并且避免在后期频繁修改。

例如:我想实现一个自己常用库的封装,取名为yourtools , 为什么不直接取tools呢?因为有重名的库,所以大家取名的时候记得先去PyPI平台上搜索看看有没有重名的库。重名的话无法发布~

二、创建项目

准备工作完成后,接下来开始创建一个新的目录来作为你的库的项目文件夹。在这个目录中,你需要包含一个setup.py文件来描述你的库,并且在适当的位置创建Python模块文件以及其他必要的文件。

  1. ├── yourtools 目录
  2.    └── db 目录
  3.    ├── __init__.py
  4.    └── mysql.py 工具类
  5. ├── requirements.txt 依赖库
  6. ├── setup.py 安装脚本
  7. ├── README.md 说明文档
  8. ├── upload_pypi.sh 上传到官方PyPI仓库脚本
  9. ├── upload_pypi_test.sh 上传到官方测试PyPI仓库脚本

这里我新建了以上文件目录,并对每个文件进行了解释。以上文件都空着即可,后续会详细讲解每个文件的代码

三、编写代码

开始编写你的Python代码,实现你所定义的功能。确保你的代码结构清晰,遵循Python的最佳实践和PEP规范。

本次演示我们将实现一个针对pymysql通用的MySQL工具类

mysql.py

  1. import pymysql
  2. from sshtunnel import SSHTunnelForwarder
  3. from .dbutils import DBConfig
  4. class MySQL:
  5. def __init__(self, db_config, ssh_tunnel=None):
  6. self.dbconfig = DBConfig(db_config)
  7. if ssh_tunnel:
  8. ssh_tunnel.start()
  9. self.dbconfig.host = ssh_tunnel.local_bind_host
  10. self.dbconfig.port = ssh_tunnel.local_bind_port
  11. self._init()
  12. def _init(self):
  13. try:
  14. self.connect = pymysql.connect(
  15. host=str(self.dbconfig.host),
  16. port=self.dbconfig.port,
  17. user=str(self.dbconfig.username),
  18. passwd=str(self.dbconfig.password),
  19. db=str(self.dbconfig.db),
  20. charset=str(self.dbconfig.charset)
  21. )
  22. self.cursor = self.connect.cursor()
  23. return True
  24. except Exception as err:
  25. raise Exception("MySQL Connection error", err)
  26. return False
  27. def get_conn(self):
  28. if self.connect:
  29. return self.connect
  30. else:
  31. self._init()
  32. return self.connect
  33. def close_conn(self):
  34. if self.connect:
  35. self.connect.close()
  36. def query(self, sql, param=None):
  37. """
  38. Query data
  39. :param sql:
  40. :param param:
  41. :param size: Number of rows of data you want to return
  42. :return:
  43. """
  44. cur = self.connect.cursor(cursor=pymysql.cursors.DictCursor)
  45. rows = None
  46. try:
  47. cur.execute(sql, param)
  48. rows = cur.fetchall()
  49. except Exception as e:
  50. raise Exception(e)
  51. self.connect.rollback()
  52. cur.close()
  53. return rows
  54. def execute(self, sql):
  55. """
  56. exec DML:INSERT、UPDATE、DELETE
  57. :param sql: dml sql
  58. :param param: string|list
  59. :return: Number of rows affected
  60. """
  61. try:
  62. self.cursor.execute(sql)
  63. self.connect.commit()
  64. except Exception as e:
  65. self.connect.rollback()

代码很简单,这里不再解释。

为了后续import方便,我们在__init__.py里对外部暴露的包名规范一下

  1. # __init__.py
  2. from .db.mysql import MySQL

四、添加库的文档和注释

良好的文档和注释对于一个库的成功至关重要。为你的代码添加详细的文档字符串和注释,以便其他人能够理解你的代码,并且能够方便地使用你的库。

接下来,我们编写README.md,这个README.md文件内容决定了你的库在PyPI平台展示的内容,例如:

readme.png

五、测试你的库

库发布之前要进行自测,避免pip安装使用时有问题。可以直接在pycharm里测试使用,也可以外部调用测试,这里我们假设我们mysql.py代码已经完成没问题。

六、发布到PyPI测试环境

一旦你确认你的库已经完善,你可以选择将其发布到PyPI等Python包管理器中,使其他人能够方便地安装和使用你的库。

编写发布库setup.py文件

  1. import setuptools
  2. import re
  3. import requests
  4. from bs4 import BeautifulSoup
  5. package_name = "yourtools"
  6. def curr_version():
  7. # 方法1:通过文件临时存储版本号
  8. # with open('VERSION') as f:
  9. # version_str = f.read()
  10. # 方法2:从官网获取版本号
  11. url = f"https://pypi.org/project/{package_name}/"
  12. response = requests.get(url)
  13. soup = BeautifulSoup(response.content, "html.parser")
  14. latest_version = soup.select_one(".release__version").text.strip()
  15. return str(latest_version)
  16. def get_version():
  17. # 从版本号字符串中提取三个数字并将它们转换为整数类型
  18. match = re.search(r"(\d+)\.(\d+)\.(\d+)", curr_version())
  19. major = int(match.group(1))
  20. minor = int(match.group(2))
  21. patch = int(match.group(3))
  22. # 对三个数字进行加一操作
  23. patch += 1
  24. if patch > 9:
  25. patch = 0
  26. minor += 1
  27. if minor > 9:
  28. minor = 0
  29. major += 1
  30. new_version_str = f"{major}.{minor}.{patch}"
  31. return new_version_str
  32. def upload():
  33. with open("README.md", "r") as fh:
  34. long_description = fh.read()
  35. with open('requirements.txt') as f:
  36. required = f.read().splitlines()
  37. setuptools.setup(
  38. name=package_name,
  39. version=get_version(),
  40. author="Author's name", # 作者名称
  41. author_email="xxxxxxx@163.com", # 作者邮箱
  42. description="Python helper tools", # 库描述
  43. long_description=long_description,
  44. long_description_content_type="text/markdown",
  45. url="https://pypi.org/project/yourtools/", # 库的官方地址
  46. packages=setuptools.find_packages(),
  47. data_files=["requirements.txt"], # yourtools库依赖的其他库
  48. classifiers=[
  49. "Programming Language :: Python :: 3",
  50. "License :: OSI Approved :: MIT License",
  51. "Operating System :: OS Independent",
  52. ],
  53. python_requires='>=3.6',
  54. install_requires=required,
  55. )
  56. def write_now_version():
  57. print("Current VERSION:", get_version())
  58. with open("VERSION", "w") as version_f:
  59. version_f.write(get_version())
  60. def main():
  61. try:
  62. upload()
  63. print("Upload success , Current VERSION:", curr_version())
  64. except Exception as e:
  65. raise Exception("Upload package error", e)
  66. if __name__ == '__main__':
  67. main()

upload_pypi_test.sh

为了保证库使用正常,我们建议先把库发布到PyPI的测试环境:https://test.pypi.org,我们可以直接修改upload_pypi_test.sh

  1. #!/bin/zsh
  2. rm -rf ./build
  3. rm -rf ./dist
  4. rm -rf ./yourtools.egg-info
  5. python3 setup.py sdist bdist_wheel
  6. python3 -m twine upload --repository-url https://test.pypi.org/legacy/ dist/*

upload_pypi_test.sh代码编写完后,可以执行sh upload_pypi_test.sh发布到测试环境,发布过程中,需要输入PyPI平台的用户名和密码

pypi_test.png

发布到测试环境后,可以直接通过pip命令安装pip install -i https://test.pypi.org/simple/yourtools

如果pip安装成功后,可以写一个test.py文件来测试使用,由于我们在__init__.py里提前import了MySQL,所以这里我们只需要执行如下命令即可导入

  1. from yourtools import MySQL

如果以上命令没报错,则说明库导入完成,下面可以测试数据库工具类的增删改查功能了

  1. def test_mysql():
  2. dbconfg = {
  3. 'host': '172.0.0.1',
  4. 'port': 3306,
  5. 'username': 'root',
  6. 'password': '123456',
  7. 'db': 'test',
  8. 'charset': 'utf8'
  9. }
  10. server = SSHTunnelForwarder(
  11. ('跳板机服务器IP', 45535),
  12. ssh_username='root',
  13. ssh_password='123456',
  14. remote_bind_address=('远程数据库IP', 3366),
  15. local_bind_address=('127.0.0.1', 3366)
  16. )
  17. # 不使用跳板机
  18. mysql = MySQL(dbconfg)
  19. # 使用跳板机,需要传递一个SSHTunnelForwarder对象
  20. mysql = MySQL(dbconfg,ssh_tunnel=server)
  21. # query data
  22. result = mysql.query("select * from users")
  23. print(result)
  24. # dml sql
  25. result = mysql.execute("insert into users(name,birthday,ts) values('灭霸2','2022-11-01 16:00:00','2022-11-01 16:00:00') ")

七、发布到PyPI官方仓库

如果以上测试没问题,下面我们将该库发布到PyPI的生产仓库中,同样逻辑,修改upload_pypi.sh文件

  1. #!/bin/bash
  2. # Upload project to pypi
  3. rm -rf ./build
  4. rm -rf ./dist
  5. rm -rf ./yourtools.egg-info
  6. python3 setup.py sdist bdist_wheel
  7. python3 -m twine upload dist/*

执行sh upload_pypi.sh发布到PyPI生产环境,发布过程中,需要输入PyPI平台的用户名和密码

八、通过pip安装测试使用

当以上步骤全部完成后,恭喜你,已经实现了将自己写的Python发布到PyPI仓库中了,接下来就可以把这个牛逼轰轰的库告诉你身边的朋友推广使用了。

pip_install.png

九、总结

  1. 本文基于yourtools库作为演示说明,该库地址https://pypi.org/project/yourtools/
  2. yourtools库源码:https://github.com/FearlessPeople/yourtools
  3. 小提示:通过setup.py文件,还可以将你的代码部署到私有Python解释器环境中哟,例如你公司服务器上的Python环境里

以上就是编写Python库的步骤,通过这些步骤,你也可以轻松地编写出一个Python库,为自己和其他人提供便利。祝你编写愉快!

关注公众号【大喇叭IT】,回复python 可进群沟通交流

7.jpeg

原文链接:https://www.cnblogs.com/meet/p/18057112

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号