保姆级教程带你开发优质的Python库之中篇【命令行发行】

雷学委 2021-10-26 04:09:46
教程 开发 带你 优质 保姆

正式的Python专栏第10篇,同学站住,别错过这个从0开始的文章!

前面学委给大家缕一缕了如何开发一个python库并导入运行, 基本完成了一个初步的库

下面指导大家把库做成命令行工具,别人就能像我们使用python或者pip工具一样,输入命令就能使用我们的库!

读者可以查看学委主页加入交流,或者去GitHub给个Star。

把Python库做成命令行的准备

项目结构如下,首先要让它支持命令行。

在这里插入图片描述

记得前面的项目截图里面还有一个setup.py 文件。

setup.py组织了整个项目模块代码和基础信息,支持命令行的诀窍就在里面。

先看一下代码,大家重点观察一个熟悉:entry_points

# -*- coding: utf-8 -*-
# @CSDN/Juejin/Wechat: 雷学委
# @XueWeiTag: OpenSource
# @File : setup.py
# @Project : pypi_seed
from distutils.core import setup
from setuptools import find_packages
setup(name='pypi_seed', # 包名
version='1.0.3', # 版本号
keywords=("pypi_seed", "seed", "generator", "levin", "leixuewei"),
description='A small tool to demo on upload package to pypi and utility scripts to generate a pypi seed',
long_description="""A small tool to demo on upload package to pypi and utility scripts to generate a pypi seed! Powered by py4ever team!""",
author='levin',
author_email='[email protected]', #项目联系人
url='https://github.com/py4ever/pypi_seed',
#学委删简了一些,非本文重点的信息
entry_points={

'console_scripts': [
'pypiseed = pypi_seed.main:main',
'pyseed = pypi_seed.main:main'
]
},
classifiers=[
'Intended Audience :: Developers' # 学委删简了一些支持多版本的,需要的去github或者gitee借鉴pypi_seed的setup.py
],
)

解释一下setup.py

简单理解,这个setup.py 就相当于一个开源模块的地图。

它包括了作者信息,项目说明,版本,项目链接,更重要的,安装后命令行的程序入口就放在“entry_points"

设置了entry_points, 我们使用pip工具安装这个模块的时候,它会自动帮我们创建相应的文件。

比如上面的entry_points是两个命令工具:

  • pypiseed 为命令行工具,对等与调用pypi_seed.main:main
  • pyseed 为命令行工具,对等与调用pypi_seed.main:main

补充说明setup.py其他参数解释

重点是作者,项目名称,联系信息,下面整理解释:

  • name : 项目名称,特别重要!其他开发者通过这个来搜索你的库
  • author : 作者
  • keywords : 项目关键字
  • description : 项目说明
  • author_email : 作者邮箱信息
  • url : 项目主页

这些比较直白,根据开源工具的定位来编写完善。

项目说明如果写不下,就放置在long description字段。万一用户在用的时候有啥反馈,还能够联系到邮箱,或者通过项目主页继续互动,这样能够保持项目的不断完善,与时俱进!

第二步 开发一个命令行处理的Python程序

生成了程序入口了,我们可以通过

pyseed 参数 #调用pypi_seed了

好了,说完entry_points, 它调用到了pypi_seed.main:main。 学委已经帮大家看了源码了。

pypiseed / pyseed里面调用了一个程序内的show_help 和args2dict 两个方法。

开源项目源码解析

这里是show_help方法,重点是输出打印一些使用信息,和项目简易说明。

def show_help():
print('usage:')
print('-h, --help: print help message.')
print('-p, --project: your desired project name')
print('-P, --path: where to save the sample project after code-generation')
print('-a, --author: the author information')
print("===========================================")
show_sample_run()
show_about()

这里就是本文的核心了,解析用户的输入。

为了解析方便,学委仅摘取了核心代码段,我们看一下。

import sys
import getopt
def args2dict():
argv = sys.argv[1:]
if '-h' in argv or '--help' in argv:
show_help()
exit(0)
try:
opts, args = getopt.getopt(argv, "p:P:a",
["path=",
"author=",
"project="])
except Exception as e:
raise ValueError("Looks like missing value, please check usage by '-h'. Current error : %s " % str(e))
project = author = path = None
for opt, arg in opts:
if opt in ['-p', '--project']:
project = arg
elif opt in ['-a', '--author']:
author = arg
elif opt in ['-P', '--path']:
path = arg
if project is None:
print("please input project with '-p' or '--project', e.g. -p my_project ")
raise ValueError("Missing project")
if author is None:
print("please input author with '-a' or '--author', e.g. -a whoami ")
raise ValueError("Missing author")
if path is None:
path = os.getcwd()
print("path is not given, so will use default as current directory : %s" % path)
return dict(project=project, author=author, path=path)

核心代码讲解

这里主要是分三步

  • 获取终端参数,判断是否输出帮助
  • 使用getopt内置库来解析p:P:a参数(-a, -P, -p) 处理为一个字典dict(管理project/author/path等信息)
  • 返回字典给生成器调用,生成种子项目。

最后使用命令行调用你的库:

安装你的库:

pip install pypi_seed

使用命令如下:

pyseed -p demo_proj -a testuser -P '.'

效果如下,这么简单就生成了,项目了,稍微开发就能成为一个自己的模块,并分享。
在这里插入图片描述

总结

别人找到你的库就很不容易了,命令行的使用也必须力求简洁易懂 ,务必把帮助提示也做的友好一些,方便快速使用嘛!

  1. 学会使用setup.py 高效的组织项目代码和配置。
  2. 开发命令行工具重点是处理用户输入的参数。
  3. 一个优秀的开源项目需要提供简便的使用帮助。

完善的开源项目代码在这:Pypi-Seed on Github

喜欢Python的朋友,请关注学习 Python基础专栏 or Python入门到精通大专栏

持续学习持续开发,我是雷学委!
编程很有趣,关键是把技术搞透彻讲明白。
创作不易,请关注收藏点赞,或者留下评论打打气!

参考链接:

https://packaging.python.org/tutorials/packaging-projects/

版权声明
本文为[雷学委]所创,转载请带上原文链接,感谢
https://levin.blog.csdn.net/article/details/120214153

  1. Python project management and construction, these four tools are enough!
  2. IDE的使用,pycharm引入Python库
  3. In the 120 series columns, you can learn the python beautiful oup4 module, 7000 word blog + climb the ninth workshop network
  4. Django运行xadmin 报错解析 ImportError: cannot import name 'DEFAULT_FORMATS' from 'import_export.admin'
  5. Python程序大学课程写程序
  6. Programme Python Programme d'études collégiales
  7. Python程序大學課程寫程序
  8. Django runxadmin Error resolution importerror: cannot Import name 'default Formats' from 'import _ Export.admin»
  9. Python 函数式编程,看这一篇足够了!
  10. 太棒了!11个好用到起飞的「Python字典」知识点!
  11. 一道Python题目,求解答!
  12. 一道Python題目,求解答!
  13. Un problème Python, s'il vous plaît!
  14. C'est génial! 11 points de connaissance du dictionnaire Python pour le décollage!
  15. Python Functional Programming, This is enough!
  16. 在python中beta分布的问题?
  17. 一个python习题,没有什么头绪,是关于进制的转换和绘制的,想了几天了,不仅仅是2,8,16这种常见的进制转换
  18. Un exercice Python, qui n'a pas beaucoup d'idées, est sur la conversion et le rendu décimaux et a pensé pendant quelques jours, pas seulement 2, 8, 16 cette conversion décimale commune
  19. Un problème avec la distribution bêta en python?
  20. python实现简单的读取excel 内容,报错
  21. L'implémentation Python lit simplement le contenu d'Excel et signale les erreurs
  22. 用Python定义一个函数,接收n个数字,求这些参数数字的和
  23. Définissez une fonction en python, recevez n nombres et additionnez ces nombres de paramètres
  24. 上电Python写文件后,再断电后导致文件内容丢失
  25. 上電Python寫文件後,再斷電後導致文件內容丟失
  26. Une fois que Python est allumé pour écrire des fichiers, le contenu des fichiers est perdu après une panne de courant
  27. python套接字编程报错:ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。
  28. 【Python从入门到精通】(二)怎么运行Python呢?有哪些好的开发工具(PyCharm)
  29. 【Python从入门到精通】(二)怎么运行Python呢?有哪些好的开发工具(PyCharm)
  30. Python语法1
  31. 2018年度最受推荐的10本Python书籍(初学者必看)
  32. Les 10 livres Python les plus recommandés en 2018 (obligatoire pour les débutants)
  33. Syntaxe Python 1
  34. Python语法1
  35. 在python 运行celery时候 AttributeError: 'NoneType' object has no attribute 'Redis'错误
  36. Attributeerror: 'nonetype' Object has no attribute 'redis' Error when Celery is running in Python
  37. Syntaxe Python 1
  38. Python celery is a plug-in that focuses on distributed asynchronous task processing and task scheduling!
  39. Python celery is a plug-in that focuses on distributed asynchronous task processing and task scheduling!
  40. 在python,使用scrapy爬虫框架
  41. It's time for everyone to see your blog written in Django (including deployment tutorial video)
  42. Python扩展速记符 要求用for循环,if语句
  43. Python擴展速記符 要求用for循環,if語句
  44. Le sténographe d'extension Python nécessite une boucle pour, si instruction
  45. Python+人工智能就业班v5.0wumi
  46. python编程技术的题目,希望能得到解答
  47. Pandas determines the header row dynamically
  48. 关于#python#的问题:模拟登陆后能获取到cookie,就是cookie一天就过期
  49. pandas为dataframe添加新的数据行(rows)、在dataframe后面纵向添加一行数据(数据为列表list形式)、列有不匹配将会使用NA值进行填补
  50. pandas使用组合条件筛选、过滤数据行
  51. 热烈祝贺1024,求解Python3.10闪退问题
  52. Python基础题练习题库有没呢?
  53. python构建神经网络,正向和反向传播
  54. python爬虫输入数字翻页才成功,用变量代替不成功,为什么?
  55. 【Python 爬虫】 2、HTTP基本原理
  56. 【Python 爬虫】 1、爬虫基础概念
  57. Python中如何用find函数计数?
  58. 一文搞懂Python装饰器
  59. python数据结构之递归
  60. 关于#python#的问题:为什么这个open函数会报错