天天看點

保姆級教程帶你開發優質的Python庫之中篇【指令行發行】

前面學委給大家縷一縷了如何開發一個python庫并導入運作, 基本完成了一個初步的庫

下面指導大家把庫做成指令行工具,别人就能像我們使用python或者pip工具一樣,輸入指令就能使用我們的庫!

讀者可以檢視學委首頁加入交流,或者去GitHub給個Star。

把Python庫做成指令行的準備

項目結構如下,首先要讓它支援指令行。

保姆級教程帶你開發優質的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 '.'
      

效果如下,這麼簡單就生成了,項目了,稍微開發就能成為一個自己的子產品,并分享。

保姆級教程帶你開發優質的Python庫之中篇【指令行發行】

總結

别人找到你的庫就很不容易了,指令行的使用也必須力求簡潔易懂 ,務必把幫助提示也做的友好一些,友善快速使用嘛!

學會使用setup.py 高效的組織項目代碼和配置。

開發指令行工具重點是處理使用者輸入的參數。

一個優秀的開源項目需要提供簡便的使用幫助。

完善的開源項目代碼在這:Pypi-Seed on Github