實(shí)現(xiàn)?Python?腳本生成命令行
有時(shí)候我們會有這樣的一個需求:
我們定義了一個 Python 的方法,方法接收一些參數(shù),但是調(diào)用的時(shí)候想將這些參數(shù)用命令行暴露出來。
比如說這里有個爬取方法:
import requests
def scrape(url, timeout=10):
response = requests.get(url, timeout=timeout)
print(response.text)這里定義了一個 scrape 方法,第一個參數(shù)接收 url,即爬取的網(wǎng)址,第二個參數(shù)接收 timeout,即指定超時(shí)時(shí)間。
調(diào)用的時(shí)候我們可能這么調(diào)用:
scrape('https:///www.baidu.com', 10)如果我們想改參數(shù)換 url,那就得改代碼對吧。
所以有時(shí)候我們就想把這些參數(shù)用命令行暴露出來,這時(shí)候我們可能就用上了 argparse 等等的庫,挨個聲明各個參數(shù)是干嘛的,非常繁瑣,
代碼如下:
parser = argparse.ArgumentParser(description='Scrape Function')
parser.add_argument('url', type=str,
help='an integer for the accumulator')
parser.add_argument('timeout', type=int,
help='sum the integers (default: find the max)')
if __name__ == '__main__':
args = parser.parse_args()
scrape(args.url, args.timeout)這樣我們才能順利地使用命令行來調(diào)用這個腳本:
python3 main.py https://www.baidu.com 10
是不是感覺非常麻煩?argparse 寫起來又臭又長,想想就費(fèi)勁。
Fire
但接下來我們要介紹一個庫,用它我們只需要兩行代碼就可以做到如上操作。
這個庫的名字叫做Fire,它可以快速為某個 Python 方法或者類添加命令行的參數(shù)支持。
先看看安裝方法,使用 pip3 安裝即可:
pip3 install fire
這樣我們就安裝好了。
使用方法
下面我們來看幾個例子。
方法支持
第一個代碼示例如下:
import fire def hello(name="World"): return "Hello %s!" % name if __name__ == '__main__': fire.Fire(hello)
這里我們定義了一個 hello 方法,然后接收一個 name 參數(shù),默認(rèn)值是 World,接著輸出了 Hello 加 name 這個字符串。
然后接著我們導(dǎo)入了 fire 這個庫,調(diào)用它的 Fire 方法并傳入 hello 這個方法聲明,會發(fā)生什么事情呢?
我們把這段代碼保存為 demo1.py,接著用 Python3 來運(yùn)行一下:
python3 demo1.py
運(yùn)行結(jié)果如下:
Hello World!
看起來并沒有什么不同。
但我們這時(shí)候如果運(yùn)行如下命令,就可以看到一些神奇的事情了:
python3 demo1.py --help
運(yùn)行結(jié)果如下:
NAME
demo1.py
SYNOPSIS
demo1.py <flags>
FLAGS
--name=NAME
Default: 'World'
可以看到,這里它將 name 這個參數(shù)轉(zhuǎn)化成了命令行的一個可選參數(shù),我們可以通過 —-name 來替換 name 參數(shù)。
我們來試下:
python3 demo1.py --name 123
這里我們傳入了一個 name 參數(shù)是 123,這時(shí)候我們就發(fā)現(xiàn)運(yùn)行結(jié)果就變成了如下內(nèi)容:
Hello 123!
是不是非常方便?我們沒有借助 argparse 就輕松完成了命令行參數(shù)的支持和替換。
那如果我們將 name 這個參數(shù)的默認(rèn)值取消呢?代碼改寫如下:
import fire def hello(name): return "Hello %s!" % name if __name__ == '__main__': fire.Fire(hello)
這時(shí)候重新運(yùn)行:
python3 demo1.py --help
就可以看到結(jié)果變成了如下內(nèi)容:
NAME
demo1.py
SYNOPSIS
demo1.py NAME
POSITIONAL ARGUMENTS
NAME
NOTES
You can also use flags syntax for POSITIONAL ARGUMENTS
這時(shí)候我們發(fā)現(xiàn) name 這個參數(shù)就變成了必傳參數(shù),我們必須在命令行里指定這個參數(shù)內(nèi)容,調(diào)用就會變成如下命令:
python3 demo1.py 123
運(yùn)行結(jié)果還是一樣的。
類支持
當(dāng)然 fire 這個庫不僅僅支持給方法添加命令行的支持,還支持給一個類添加命令行的支持。
下面我們再看一個例子:
import fire
class Calculator(object):
def double(self, number):
return 2 * number
if __name__ == '__main__':
fire.Fire(Calculator)我們把這個代碼保存為 demo2.py,然后運(yùn)行:
python3 demo2.py
運(yùn)行結(jié)果如下:
NAME
demo2.pySYNOPSIS
demo2.py COMMANDCOMMANDS
COMMAND is one of the following:double
可以看到,這里它將 Calculator 這個類中的方法識別出來了,COMMAND 之一就是 double,我們試著調(diào)用下:
python3 demo2.py double
運(yùn)行結(jié)果如下:
ERROR: The function received no value for the required argument: number
Usage: demo2.py double NUMBERFor detailed information on this command, run:
demo2.py double --help
這里就說了,這里必須要指定另外一個參數(shù),叫做 NUMBER,同時(shí)這個參數(shù)還是必填參數(shù),我們試著加下:
python3 demo2.py double 4
運(yùn)行結(jié)果如下:
8
這時(shí)候就可以達(dá)到正確結(jié)果了。
所以說,綜合來看,fire 可以為一個類命令行,每個命令都對應(yīng)一個方法的名稱,同時(shí)在后面添加額外的可選或必選參數(shù),加到命令行參數(shù)的后面。
重新改寫
最后,讓我們回過頭來,給我們一開始定義的 scrape 方法添加命令行的參數(shù)支持:
import requests
import fire
def scrape(url, timeout=10):
response = requests.get(url, timeout=timeout)
print(response.text)
if __name__ == '__main__':
fire.Fire(scrape)這樣就可以了!省去了冗長的 argparse 的代碼,是不是非常方便?
調(diào)用就是如下形式:
NAME
main.py
SYNOPSIS
main.py URL <flags>
POSITIONAL ARGUMENTS
URL
FLAGS
--timeout=TIMEOUT
Default: 10這里說了,URL 是必傳參數(shù),timeout 是可選參數(shù)。
最后調(diào)用下:
python3 main.py https://www.baidu.com
這樣我們就可以輕松將 url 通過命令行傳遞過去了。
當(dāng)然 timeout 還是可選值,我們可以通過 —-timeout 來指定 timeout 參數(shù):
python3 main.py https://www.baidu.com --timeout 5
這樣兩個參數(shù)就都能順利賦值了,最后效果就是爬取百度,5 秒超時(shí)。
到此這篇關(guān)于實(shí)現(xiàn) Python 腳本生成命令行的文章就介紹到這了,更多相關(guān) Python 命令行內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python 利用argparse模塊實(shí)現(xiàn)腳本命令行參數(shù)解析
- 找Python安裝目錄,設(shè)置環(huán)境路徑以及在命令行運(yùn)行python腳本實(shí)例
- 命令行運(yùn)行Python腳本時(shí)傳入?yún)?shù)的三種方式詳解
- python環(huán)境路徑配置以及命令行運(yùn)行腳本
- 解決Python 命令行執(zhí)行腳本時(shí),提示導(dǎo)入的包找不到的問題
- 在CMD命令行中運(yùn)行python腳本的方法
- shell命令行,一鍵創(chuàng)建 python 模板文件腳本方法
- 用Python實(shí)現(xiàn)命令行鬧鐘腳本實(shí)例
相關(guān)文章
python實(shí)現(xiàn)圖片轉(zhuǎn)換成素描和漫畫格式
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)圖片轉(zhuǎn)換成素描和漫畫格式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-08-08
解決pandas.DataFrame.fillna 填充Nan失敗的問題
今天小編就為大家分享一篇解決pandas.DataFrame.fillna 填充Nan失敗的問題。具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-11-11
Django REST Framework 分頁(Pagination)詳解
這篇文章主要介紹了Django REST Framework 分頁(Pagination)詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
numpy數(shù)組之存取文件的實(shí)現(xiàn)示例
這篇文章主要介紹了numpy數(shù)組之存取文件的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05
PyTorch中Tensor的數(shù)據(jù)類型和運(yùn)算的使用
這篇文章主要介紹了PyTorch中Tensor的數(shù)據(jù)類型和運(yùn)算的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
對python-3-print重定向輸出的幾種方法總結(jié)
今天小編就為大家分享一篇對python-3-print重定向輸出的幾種方法總結(jié),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-05-05
為python爬蟲docker鏡像添加nodejs環(huán)境實(shí)現(xiàn)方法
這篇文章主要為大家介紹了為python爬蟲docker鏡像添加nodejs環(huán)境實(shí)現(xiàn)方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09

