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

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 正式的Python专栏第10篇,同学站住,别错过这个从0开始的文章!

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


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


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


把Python库做成命令行的准备

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


image.png

记得前面的项目截图里面还有一个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='790839397@qq.com', #项目联系人
      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 '.'

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

image.png

总结

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


学会使用setup.py 高效的组织项目代码和配置。

开发命令行工具重点是处理用户输入的参数。

一个优秀的开源项目需要提供简便的使用帮助。

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


目录
相关文章
|
3天前
|
Python
全网最适合入门的面向对象编程教程:Python函数方法与接口-函数与方法的区别和lamda匿名函数
【9月更文挑战第15天】在 Python 中,函数与方法有所区别:函数是独立的代码块,可通过函数名直接调用,不依赖特定类或对象;方法则是与类或对象关联的函数,通常在类内部定义并通过对象调用。Lambda 函数是一种简洁的匿名函数定义方式,常用于简单的操作或作为其他函数的参数。根据需求,可选择使用函数、方法或 lambda 函数来实现代码逻辑。
|
4天前
|
SQL 前端开发 数据可视化
Rodeo支持多种Python库
Rodeo支持多种Python库
12 5
|
2天前
|
数据采集 存储 JSON
从零到一构建网络爬虫帝国:HTTP协议+Python requests库深度解析
在网络数据的海洋中,网络爬虫遵循HTTP协议,穿梭于互联网各处,收集宝贵信息。本文将从零开始,使用Python的requests库,深入解析HTTP协议,助你构建自己的网络爬虫帝国。首先介绍HTTP协议基础,包括请求与响应结构;然后详细介绍requests库的安装与使用,演示如何发送GET和POST请求并处理响应;最后概述爬虫构建流程及挑战,帮助你逐步掌握核心技术,畅游数据海洋。
17 3
|
8天前
|
数据采集 网络协议 API
HTTP协议大揭秘!Python requests库实战,让网络请求变得简单高效
【9月更文挑战第13天】在数字化时代,互联网成为信息传输的核心平台,HTTP协议作为基石,定义了客户端与服务器间的数据传输规则。直接处理HTTP请求复杂繁琐,但Python的`requests`库提供了一个简洁强大的接口,简化了这一过程。HTTP协议采用请求与响应模式,无状态且结构化设计,使其能灵活处理各种数据交换。
36 8
|
12天前
|
JSON API 开发者
Python网络编程新纪元:urllib与requests库,让你的HTTP请求无所不能
【9月更文挑战第9天】随着互联网的发展,网络编程成为现代软件开发的关键部分。Python凭借简洁、易读及强大的特性,在该领域展现出独特魅力。本文介绍了Python标准库中的`urllib`和第三方库`requests`在处理HTTP请求方面的优势。`urllib`虽API底层但功能全面,适用于深入控制HTTP请求;而`requests`则以简洁的API和人性化设计著称,使HTTP请求变得简单高效。两者互补共存,共同推动Python网络编程进入全新纪元,无论初学者还是资深开发者都能从中受益。
30 7
|
15天前
|
缓存 测试技术 Apache
告别卡顿!Python性能测试实战教程,JMeter&Locust带你秒懂性能优化💡
【9月更文挑战第5天】性能测试是确保应用在高负载下稳定运行的关键。本文介绍Apache JMeter和Locust两款常用性能测试工具,帮助识别并解决性能瓶颈。JMeter适用于测试静态和动态资源,而Locust则通过Python脚本模拟HTTP请求。文章详细讲解了安装、配置及使用方法,并提供了实战案例,帮助你掌握性能测试技巧,提升应用性能。通过分析测试结果、模拟并发、检查资源使用情况及代码优化,确保应用在高并发环境下表现优异。
42 5
|
4月前
|
存储 安全 API
【Python 基础教程 21】Python3 文件操作全面指南:从入门到精通的综合教程
【Python 基础教程 21】Python3 文件操作全面指南:从入门到精通的综合教程
140 0
|
4月前
|
机器学习/深度学习 数据采集 C++
【Python 基础教程 07】全面掌握Python3数字操作:入门到精通的实用指南
【Python 基础教程 07】全面掌握Python3数字操作:入门到精通的实用指南
129 2
|
4月前
|
Linux 数据库连接 C++
【Python 基础教程 23】Python3 错误与异常处理全面指南:从入门到精通的实用教程
【Python 基础教程 23】Python3 错误与异常处理全面指南:从入门到精通的实用教程
297 0
|
4月前
|
监控 API C语言
【Python 基础教程 22】全面揭秘Python3 os模块:从入门到高级的实用教程指南
【Python 基础教程 22】全面揭秘Python3 os模块:从入门到高级的实用教程指南
225 1