<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
有時候我們會有這樣的一個需求:
我們定義了一個 Python 的方法,方法接收一些引數,但是呼叫的時候想將這些引數用命令列暴露出來。
比如說這裡有個爬取方法:
import requests def scrape(url, timeout=10): response = requests.get(url, timeout=timeout) print(response.text)
這裡定義了一個 scrape 方法,第一個引數接收 url,即爬取的網址,第二個引數接收 timeout,即指定超時時間。
呼叫的時候我們可能這麼呼叫:
scrape('https:///www.baidu.com', 10)
如果我們想改引數換 url,那就得改程式碼對吧。
所以有時候我們就想把這些引數用命令列暴露出來,這時候我們可能就用上了 argparse 等等的庫,挨個宣告各個引數是幹嘛的,非常繁瑣,
程式碼如下:
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)
這樣我們才能順利地使用命令列來呼叫這個指令碼:
python3 main.py https://www.baidu.com 10
是不是感覺非常麻煩?argparse 寫起來又臭又長,想想就費勁。
但接下來我們要介紹一個庫,用它我們只需要兩行程式碼就可以做到如上操作。
這個庫的名字叫做Fire,它可以快速為某個 Python 方法或者類新增命令列的引數支援。
先看看安裝方法,使用 pip3 安裝即可:
pip3 install fire
這樣我們就安裝好了。
下面我們來看幾個例子。
第一個程式碼範例如下:
import fire def hello(name="World"): return "Hello %s!" % name if __name__ == '__main__': fire.Fire(hello)
這裡我們定義了一個 hello 方法,然後接收一個 name 引數,預設值是 World,接著輸出了 Hello 加 name 這個字串。
然後接著我們匯入了 fire 這個庫,呼叫它的 Fire 方法並傳入 hello 這個方法宣告,會發生什麼事情呢?
我們把這段程式碼儲存為 demo1.py,接著用 Python3 來執行一下:
python3 demo1.py
執行結果如下:
Hello World!
看起來並沒有什麼不同。
但我們這時候如果執行如下命令,就可以看到一些神奇的事情了:
python3 demo1.py --help
執行結果如下:
NAME
demo1.py
SYNOPSIS
demo1.py <flags>
FLAGS
--name=NAME
Default: 'World'
可以看到,這裡它將 name 這個引數轉化成了命令列的一個可選引數,我們可以通過 —-name
來替換 name 引數。
我們來試下:
python3 demo1.py --name 123
這裡我們傳入了一個 name 引數是 123,這時候我們就發現執行結果就變成了如下內容:
Hello 123!
是不是非常方便?我們沒有藉助 argparse 就輕鬆完成了命令列引數的支援和替換。
那如果我們將 name 這個引數的預設值取消呢?程式碼改寫如下:
import fire def hello(name): return "Hello %s!" % name if __name__ == '__main__': fire.Fire(hello)
這時候重新執行:
python3 demo1.py --help
就可以看到結果變成了如下內容:
NAME
demo1.py
SYNOPSIS
demo1.py NAME
POSITIONAL ARGUMENTS
NAME
NOTES
You can also use flags syntax for POSITIONAL ARGUMENTS
這時候我們發現 name 這個引數就變成了必傳引數,我們必須在命令列裡指定這個引數內容,呼叫就會變成如下命令:
python3 demo1.py 123
執行結果還是一樣的。
當然 fire 這個庫不僅僅支援給方法新增命令列的支援,還支援給一個類新增命令列的支援。
下面我們再看一個例子:
import fire class Calculator(object): def double(self, number): return 2 * number if __name__ == '__main__': fire.Fire(Calculator)
我們把這個程式碼儲存為 demo2.py,然後執行:
python3 demo2.py
執行結果如下:
NAME
demo2.pySYNOPSIS
demo2.py COMMANDCOMMANDS
COMMAND is one of the following:double
可以看到,這裡它將 Calculator 這個類中的方法識別出來了,COMMAND 之一就是 double,我們試著呼叫下:
python3 demo2.py double
執行結果如下:
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
這裡就說了,這裡必須要指定另外一個引數,叫做 NUMBER,同時這個引數還是必填引數,我們試著加下:
python3 demo2.py double 4
執行結果如下:
8
這時候就可以達到正確結果了。
所以說,綜合來看,fire 可以為一個類命令列,每個命令都對應一個方法的名稱,同時在後面新增額外的可選或必選引數,加到命令列引數的後面。
最後,讓我們回過頭來,給我們一開始定義的 scrape 方法新增命令列的引數支援:
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 的程式碼,是不是非常方便?
呼叫就是如下形式:
NAME main.py SYNOPSIS main.py URL <flags> POSITIONAL ARGUMENTS URL FLAGS --timeout=TIMEOUT Default: 10
這裡說了,URL 是必傳引數,timeout 是可選引數。
最後呼叫下:
python3 main.py https://www.baidu.com
這樣我們就可以輕鬆將 url 通過命令列傳遞過去了。
當然 timeout 還是可選值,我們可以通過 —-timeout
來指定 timeout 引數:
python3 main.py https://www.baidu.com --timeout 5
這樣兩個引數就都能順利賦值了,最後效果就是爬取百度,5 秒超時。
到此這篇關於實現 Python 指令碼生成命令列的文章就介紹到這了,更多相關 Python 命令列內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45