1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

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

        共 3719字,需瀏覽 8分鐘

         ·

        2022-01-06 12:10

        這是「進擊的Coder」的第?547?篇技術分享作者:崔慶才


        有時候我們會有這樣的一個需求:

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

        比如說這里有個爬取方法:

        import?requests

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

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

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

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

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

        所以有時候我們就想把這些參數(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 寫起來又臭又長,想想就費勁。

        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ù),默認值是 World,接著輸出了 Hello 加 name 這個字符串。

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

        我們把這段代碼保存為 demo1.py,接著用 Python3 來運行一下:

        python3?demo1.py

        運行結(jié)果如下:

        Hello?World!

        看起來并沒有什么不同。

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

        python3?demo1.py?--help

        運行結(jié)果如下:

        NAME
        ????demo1.py

        SYNOPSIS
        ????demo1.py?

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

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

        我們來試下:

        python3?demo1.py?--name?123

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

        Hello?123!

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

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

        import?fire

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

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

        這時候重新運行:

        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

        這時候我們發(fā)現(xiàn) name 這個參數(shù)就變成了必傳參數(shù),我們必須在命令行里指定這個參數(shù)內(nèi)容,調(diào)用就會變成如下命令:

        python3?demo1.py?123

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

        類支持

        當然 fire 這個庫不僅僅支持給方法添加命令行的支持,還支持給一個類添加命令行的支持。

        下面我們再看一個例子:

        import?fire

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

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

        我們把這個代碼保存為 demo2.py,然后運行:

        python3?demo2.py

        運行結(jié)果如下:

        NAME
        ????demo2.py

        SYNOPSIS
        ????demo2.py?COMMAND

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

        ?????double

        可以看到,這里它將 Calculator 這個類中的方法識別出來了,COMMAND 之一就是 double,我們試著調(diào)用下:

        python3?demo2.py?double

        運行結(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

        這里就說了,這里必須要指定另外一個參數(shù),叫做 NUMBER,同時這個參數(shù)還是必填參數(shù),我們試著加下:

        python3?demo2.py?double?4

        運行結(jié)果如下:

        8

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

        所以說,綜合來看,fire 可以為一個類命令行,每個命令都對應一個方法的名稱,同時在后面添加額外的可選或必選參數(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?

        POSITIONAL?ARGUMENTS
        ????URL

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

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

        最后調(diào)用下:

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

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

        當然 timeout 還是可選值,我們可以通過?—-timeout?來指定 timeout 參數(shù):

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

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

        怎么樣?是不是很方便?大家快用起來吧!


        577a5e6bd72fdfb278d7fd6b58ea5263.webp

        End

        崔慶才的新書《Python3網(wǎng)絡爬蟲開發(fā)實戰(zhàn)(第二版)》已經(jīng)正式上市了!書中詳細介紹了零基礎用 Python 開發(fā)爬蟲的各方面知識,同時相比第一版新增了 JavaScript 逆向、Android 逆向、異步爬蟲、深度學習、Kubernetes 相關內(nèi)容,?同時本書已經(jīng)獲得 Python 之父 Guido 的推薦,目前本書正在七折促銷中!

        內(nèi)容介紹:《Python3網(wǎng)絡爬蟲開發(fā)實戰(zhàn)(第二版)》內(nèi)容介紹


        d51d468ae1be70b9ac0679c64c87d56a.webp


        掃碼購買




        好文和朋友一起看~


        瀏覽 43
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            国产欧美在线免费观看 | 青青草自拍 | 婷婷国产 | 精品一区二区久久久久久久网站 | 我被下药做得好爽 | 日韩三区 | 美女操逼的网站 | 成人亚洲区无码偷拍麻豆 | 狠狠撸综合 | 国产黄色视频在线免费看 |