前面學委給大家縷一縷了如何開發一個python庫并導入運作, 基本完成了一個初步的庫
下面指導大家把庫做成指令行工具,别人就能像我們使用python或者pip工具一樣,輸入指令就能使用我們的庫!
讀者可以檢視學委首頁加入交流,或者去GitHub給個Star。
把Python庫做成指令行的準備
項目結構如下,首先要讓它支援指令行。

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 '.'
效果如下,這麼簡單就生成了,項目了,稍微開發就能成為一個自己的子產品,并分享。
總結
别人找到你的庫就很不容易了,指令行的使用也必須力求簡潔易懂 ,務必把幫助提示也做的友好一些,友善快速使用嘛!
學會使用setup.py 高效的組織項目代碼和配置。
開發指令行工具重點是處理使用者輸入的參數。
一個優秀的開源項目需要提供簡便的使用幫助。
完善的開源項目代碼在這:Pypi-Seed on Github