<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          兩行代碼,為 Python 腳本生成命令行!

          共 3830字,需瀏覽 8分鐘

           ·

          2022-01-09 20:17

          點(diǎn)擊上方Python知識(shí)圈設(shè)為星標(biāo)

          回復(fù)100獲取100題PDF

          閱讀文本大概需要 5?分鐘


          有時(shí)候我們會(huì)有這樣的一個(gè)需求:

          我們定義了一個(gè) Python 的方法,方法接收一些參數(shù),但是調(diào)用的時(shí)候想將這些參數(shù)用命令行暴露出來(lái)。

          比如說(shuō)這里有個(gè)爬取方法:

          import?requests

          def?scrape(url,?timeout=10):
          ????response?=?requests.get(url,?timeout=timeout)
          ????print(response.text)

          這里定義了一個(gè) scrape 方法,第一個(gè)參數(shù)接收 url,即爬取的網(wǎng)址,第二個(gè)參數(shù)接收 timeout,即指定超時(shí)時(shí)間。

          調(diào)用的時(shí)候我們可能這么調(diào)用:

          scrape('https:///www.baidu.com',?10)

          如果我們想改參數(shù)換 url,那就得改代碼對(duì)吧。

          所以有時(shí)候我們就想把這些參數(shù)用命令行暴露出來(lái),這時(shí)候我們可能就用上了 argparse 等等的庫(kù),挨個(gè)聲明各個(gè)參數(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)

          這樣我們才能順利地使用命令行來(lái)調(diào)用這個(gè)腳本:

          python3?main.py?https://www.baidu.com?10

          是不是感覺(jué)非常麻煩?argparse 寫(xiě)起來(lái)又臭又長(zhǎng),想想就費(fèi)勁。

          Fire

          但接下來(lái)我們要介紹一個(gè)庫(kù),用它我們只需要兩行代碼就可以做到如上操作。

          這個(gè)庫(kù)的名字叫做Fire,它可以快速為某個(gè) Python 方法或者類添加命令行的參數(shù)支持。

          先看看安裝方法,使用 pip3 安裝即可:

          pip3?install?fire

          這樣我們就安裝好了。

          使用

          下面我們來(lái)看幾個(gè)例子。

          方法支持

          第一個(gè)代碼示例如下:

          import?fire

          def?hello(name="World"):
          ??return?"Hello?%s!"?%?name

          if?__name__?==?'__main__':
          ??fire.Fire(hello)

          這里我們定義了一個(gè) hello 方法,然后接收一個(gè) name 參數(shù),默認(rèn)值是 World,接著輸出了 Hello 加 name 這個(gè)字符串。

          然后接著我們導(dǎo)入了 fire 這個(gè)庫(kù),調(diào)用它的 Fire 方法并傳入 hello 這個(gè)方法聲明,會(huì)發(fā)生什么事情呢?

          我們把這段代碼保存為 demo1.py,接著用 Python3 來(lái)運(yùn)行一下:

          python3?demo1.py

          運(yùn)行結(jié)果如下:

          Hello?World!

          看起來(lái)并沒(méi)有什么不同。

          但我們這時(shí)候如果運(yùn)行如下命令,就可以看到一些神奇的事情了:

          python3?demo1.py?--help

          運(yùn)行結(jié)果如下:

          NAME
          ????demo1.py

          SYNOPSIS
          ????demo1.py?

          FLAGS
          ????--name=NAME
          ????????Default:?'World'

          可以看到,這里它將 name 這個(gè)參數(shù)轉(zhuǎn)化成了命令行的一個(gè)可選參數(shù),我們可以通過(guò)?—-name?來(lái)替換 name 參數(shù)。

          我們來(lái)試下:

          python3?demo1.py?--name?123

          這里我們傳入了一個(gè) name 參數(shù)是 123,這時(shí)候我們就發(fā)現(xiàn)運(yùn)行結(jié)果就變成了如下內(nèi)容:

          Hello?123!

          是不是非常方便?我們沒(méi)有借助 argparse 就輕松完成了命令行參數(shù)的支持和替換。

          那如果我們將 name 這個(gè)參數(shù)的默認(rèn)值取消呢?代碼改寫(xiě)如下:

          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 這個(gè)參數(shù)就變成了必傳參數(shù),我們必須在命令行里指定這個(gè)參數(shù)內(nèi)容,調(diào)用就會(huì)變成如下命令:

          python3?demo1.py?123

          運(yùn)行結(jié)果還是一樣的。

          類支持

          當(dāng)然 fire 這個(gè)庫(kù)不僅僅支持給方法添加命令行的支持,還支持給一個(gè)類添加命令行的支持。

          下面我們?cè)倏匆粋€(gè)例子:

          import?fire

          class?Calculator(object):????
          ????def?double(self,?number):
          ????????return?2?*?number

          if?__name__?==?'__main__':
          ????fire.Fire(Calculator)

          我們把這個(gè)代碼保存為 demo2.py,然后運(yùn)行:

          python3?demo2.py

          運(yùn)行結(jié)果如下:

          NAME
          ????demo2.py

          SYNOPSIS
          ????demo2.py?COMMAND

          COMMANDS
          ????COMMAND?is?one?of?the?following:

          ?????double

          可以看到,這里它將 Calculator 這個(gè)類中的方法識(shí)別出來(lái)了,COMMAND 之一就是 double,我們?cè)囍{(diào)用下:

          python3?demo2.py?double

          運(yùn)行結(jié)果如下:

          ERROR:?The?function?received?no?value?for?the?required?argument:?number
          Usage:?demo2.py?double?NUMBER

          For?detailed?information?on?this?command,?run:
          ??demo2.py?double?--help

          這里就說(shuō)了,這里必須要指定另外一個(gè)參數(shù),叫做 NUMBER,同時(shí)這個(gè)參數(shù)還是必填參數(shù),我們?cè)囍酉拢?/p>

          python3?demo2.py?double?4

          運(yùn)行結(jié)果如下:

          8

          這時(shí)候就可以達(dá)到正確結(jié)果了。

          所以說(shuō),綜合來(lái)看,fire 可以為一個(gè)類命令行,每個(gè)命令都對(duì)應(yīng)一個(gè)方法的名稱,同時(shí)在后面添加額外的可選或必選參數(shù),加到命令行參數(shù)的后面。

          重新改寫(xiě)

          最后,讓我們回過(guò)頭來(lái),給我們一開(kāi)始定義的 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)

          這樣就可以了!省去了冗長(zhǎng)的 argparse 的代碼,是不是非常方便?

          調(diào)用就是如下形式:

          NAME
          ????main.py

          SYNOPSIS
          ????main.py?URL?

          POSITIONAL?ARGUMENTS
          ????URL

          FLAGS
          ????--timeout=TIMEOUT
          ????????Default:?10

          這里說(shuō)了,URL 是必傳參數(shù),timeout 是可選參數(shù)。

          最后調(diào)用下:

          python3?main.py?https://www.baidu.com?

          這樣我們就可以輕松將 url 通過(guò)命令行傳遞過(guò)去了。

          當(dāng)然 timeout 還是可選值,我們可以通過(guò)?—-timeout?來(lái)指定 timeout 參數(shù):

          python3?main.py?https://www.baidu.com?--timeout?5

          這樣兩個(gè)參數(shù)就都能順利賦值了,最后效果就是爬取百度,5 秒超時(shí)。

          怎么樣?是不是很方便?大家快用起來(lái)吧!


          PS:我自己建了一個(gè)每天可領(lǐng)外賣優(yōu)惠券的號(hào),經(jīng)常領(lǐng)到15元的無(wú)門(mén)檻券不花冤枉錢(qián)~
          加微信送《Python知識(shí)點(diǎn)100題PDF》

          pk哥個(gè)人微信


          添加pk哥個(gè)人微信即送Python資料


          Python知識(shí)點(diǎn)100題的PDF

          Python相關(guān)的電子書(shū)10本


          記得備注:“100題”




          往期推薦
          01

          假裝很忙的2個(gè)命令行工具

          02

          Python經(jīng)典100題PDF整理

          03

          求你了,別再用 pip 那烏龜?shù)乃俣热グ惭b庫(kù)了!

          我就知道你“在看”

          瀏覽 32
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  超碰夜夜操 | 日韩X X免费 | 天天噪天天射天天拍 | 91美女精品 | 国产精品美女视频免费线播放 |