如何發佈一個Python命令行工具

原文出處: 無與童比   html

上次寫的一個終端裏面鬥魚TV彈幕Python版本和Ruby版本,而且發佈到PIP和RubyGems上面.在發佈PIP包的時候,竟然Google不到一篇能夠很是好的講解這個流程的文章.因而整理這篇文章,而且方便後來本身檢索,而且方便他人找資料.python

自推薦下依照本文定製的命令行工具danmu.fm的github地址:git

https://github.com/twocucao/danmu.fmgithub

本文的目的也是很是簡單:數據庫

寫一個Python命令行工具,而且發佈到PIP上面.而且在這個過程當中給出我本身的一些思考.編程

如何分解這個發佈任務?

只須要進行以下的兩個步驟即可以:安全

  • 1.寫好一個Python命令行工具.架構

  • 2.發佈它.app

固然,這樣不夠細緻.再細分一下.ide

  • 1.寫好一個Python命令行工具

    • 1.1.命令行的特色,以及Python的如何編寫命令行

    • 1.2.如何組織代碼結構.

  • 2.發佈

  • 2.1.註冊pypi帳戶

    • 2.2.註冊在帳戶下面註冊Python包

    • 2.3.上傳打包好的Python命令行工具.

    • 3.完善代碼

1.寫好一個Python命令行工具

寫好一個命令行工具首先要知道命令行工具是什麼?

在我看來,命令行工具就是一種完成某種類型的任務的終端程序.

也就是基本上沒有什麼用戶界面的程序.

因爲基本上沒有什麼用戶界面,因此致使單個命令行的交互能力及其低下.但這種低下的交互性對於一些固定工做而言,簡直就是最靈活的工具.只須要輸入一些命令即可以完成某種類型的工做.實在是方便的很.

因此,某種程度上,終端程序低交互的缺點反而成了優勢.

1.1.Python的如何編寫一個簡單的命令行

對於Python和命令行交互,咱們很容易想出一個比較方便的方案.

sys.argv就是這樣的嘛!

咱們很容易這樣寫代碼.

1

python testargv.py thisisaargv1

甚至咱們也能夠這樣寫命令行,

1

python testargv.py thisisaargv1 -d -f 0

那麼,這樣寫的後果就是,不方便解析出(不是不能,是不方便) -d -f 0 以及 thisisaargv1.

不信的話,你解析一個下面場景的命令行試試,

1

2

3

4

# 用戶可能這樣輸入

danmu.fm http://www.douyutv.com/xiaocang -q 1 -v 2

danmu.fm -q 1 -v 2 http://www.douyutv.com/xiaocang

# 固然,確定還有漏寫啦,等等,你得須要轉類型,增長各類blablabla的描述吧,添加默認的參數值吧.

因而Python就提供了一個很是好用的模塊可使用.叫作argparse.

上面的描述就變成了這個樣子

Python

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

import argparse

 

APP_DESC="""

這就是描述

"""

print(APP_DESC)

if len(sys.argv) == 1:

    sys.argv.append('--help')

parser = argparse.ArgumentParser()

parser.add_argument('-q','--quality',type=int,default=0,help="download video quality : 1 for the standard-definition; 3 for the super-definition")

parser.add_argument('-v','--verbose', default=0,help="print more debuging information")

parser.add_argument('-s','--store',help="保存流媒體文件到指定位置")

parser.add_argument('-c','--config',default=0,help="讀取~/.danmu.fm配置,請~/.danmu.fm指定數據庫")

parser.add_argument('url',metavar='URL',nargs='+', help="zhubo page URL (http://www.douyutv.com/*/)")

args = parser.parse_args()

# 獲取對應參數只須要args.quality,args.url之類.

url = (args.url)[0]

print(url)

#其餘執行邏輯

保存爲danmu.py

這樣就能夠執行命令

1

python danmu.py http://www.douyutv.com/xiaocang -q 1 -v 2

經過args就能夠獲取參數,而後進行終端程序的參數初始化.

但是這和咱們的要求仍是不一樣嘛,咱們不想多寫Python XXX,咱們想直接XXX.就像這樣.

1

danmu.fm -q 1 -v 2 http://www.douyutv.com/xiaocang

不急,下面就是了.

1.2.如何組織代碼結構.

因而,如今就要開始組織代碼結構了.

咱們在最終的代碼目錄大概是這樣的.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

danmu.fm

├── README.md

├── danmufm

   ├── __init__.py

   ├── client

      ├── __init__.py

      ├── __init__.pyc

      ├── douyu_client.py

      └── douyu_danmu_client.py

   ├── danmu.py

   ├── misc

      ├── __init__.py

      ├── color_printer.py

      ├── downloaders.py

      └── player.py

   └── model

       ├── __init__.py

       └── douyu_msg.py

├── docs

├── setup.cfg

├── setup.py

├── sh.py

└── tests

這就是我上次寫的danmu.fm的代碼目錄.

聰明的你這時候你注意到了:

  1. 主要的程序不是放在根目錄下面,而是放在第二目錄danmufm下面.
    2.setup.cfg 是什麼鬼東西
    3.setup.py 是什麼鬼東西

對於上面幾點,咱們分別進行解釋

1.2.1 爲何主要程序在第二目錄下

爲了把主要的程序分離出來,放在第二目錄下面,這樣的待會打包之後多出不少文件夾就不會對源碼形成干擾.

固然,因爲把程序放在了第二目錄下面,因此,腳本里面的from import語句應該使用相對路徑導入.

相對路徑導入的的時候須要注意運行的時候使用以下命令

1

python3 -m danmufm.danmu [xxxx]

1.2.2 setup.cfg

填寫以下內容便可.

1

2

[metadata]

description-file = README.md

而後去寫Markdown的Readme就行了.

1.2.3 setup.py

這個是重頭戲了.

setup這個py文件就是打包配置文件.對這個程序是誰的,有什麼依賴,入口是什麼,等等等等的配置.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

#-*- encoding: UTF-8 -*-

from setuptools import setup, find_packages

"""

打包的用的setup必須引入,

"""

 

VERSION = '0.1.1'

 

setup(name='danmu.fm',

      version=VERSION,

      description="a tiny and smart cli player of douyutv,ximalayad,anmu based on Python",

      long_description='just enjoy',

      classifiers=[], # Get strings from http://pypi.python.org/pypi?%3Aaction=list_classifiers

      keywords='python douyu danmu danmu.fm terminal',

      author='twocucao',

      author_email='twocucao@gmail.com',

      url='https://github.com/twocucao/doumu.fm',

      license='MIT',

      packages=find_packages(),

      include_package_data=True,

      zip_safe=True,

      install_requires=[

        'requests',

      ],

      entry_points={

        'console_scripts':[

            'danmu.fm = danmufm.danmu:main'

        ]

      },

)

官方有distutils這個包管理器工具,設置也很是的簡單,只是,它不支持entry_points屬性,因爲沒法使用entry_point,也就沒法經過命令來跳轉到指定模塊運行程序,這也就意味着,官方工具不方便寫成命令行.仍是setuptools好.

上面須要注意的就是install_requires能夠添加依賴.其餘的你猜均可以猜出來是作什麼的.本身去看代碼,我就很少說了.

2.發佈

所謂的發佈,就是將打包好的程序的某個版本發佈到某個倉庫中.

2.1.註冊pypi帳戶

到這個上面註冊帳號:
https://pypi.python.org/pypi

2.2.註冊在帳戶下面註冊Python包

進入對應項目根文件,而後執行

1

python3 setup.py register

這一步程序會讓你輸入剛剛註冊的帳號和密碼,而後註冊該包.註冊該包之後,你就有了一個小倉庫.能夠存放不一樣版本的danmu.fm.

註冊的倉庫是能夠在這個地址看到的,
https://pypi.python.org/pypi?%3Aaction=pkg_edit&name=danmu.fm

2.3.上傳打包好的Python命令行工具.

這裏須要藉助一個小工具,twine.twine是一個更加安全方便上傳打包好的代碼的工具.

1

pip3 install twine

接着開始打包,打包成兩個版本,一個是不須要build的版本,另外一個是須要build的版本(順帶吐槽下,這兩個詭異的命名).

1

python setup.py sdist bdist_wheel

因而剩下來的就顯而易見了,上傳build完畢的程序到倉庫中.

1

twine upload dist/danmu.fm-0.1.2*

因而,安裝一下,測試是否成功

1

pip3 install danmu.fm --upgrade

命令行的工具是這樣使用的.

1

danmu.fm -q 2 -v 1 http://www.douyutv.com/16789

3.完善

不斷的完善代碼,而後打包終端程序發佈到倉庫給別人用,這就是整個的PIP打包發佈流程.

  • 這個時候,你可能須要使用版本控制軟件.

  • 你可能須要增多的代碼的測試.

http://cxy.liuzhihengseo.com/483.html

問啊-定製化IT教育平臺,牛人一對一服務,有問必答,開發編程社交頭條 官方網站:www.wenaaa.com 下載問啊APP,參與官方懸賞,賺百元現金。


QQ羣290551701 彙集不少互聯網精英,技術總監,架構師,項目經理!開源技術研究,歡迎業內人士,大牛及新手有志於從事IT行業人員進入!

相關文章
相關標籤/搜索