<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編寫完善的命令行工具,只需要一行代碼

          共 5542字,需瀏覽 12分鐘

           ·

          2021-06-25 04:14

          提到編寫命令行工具,你可能會(huì)想到用 sys.argv 或者標(biāo)準(zhǔn)庫(kù) argparse,沒錯(cuò),這兩個(gè)很常用,不過情況復(fù)雜時(shí)沒有那么方便和高效,因此今天分享兩個(gè)工具,讓你編寫命令行工具不費(fèi)吹灰之力。

          1. python-fire

          python-fire 是一個(gè)三方庫(kù),可以將任何 Python 對(duì)象變成一個(gè)命令行接口。

          使用前先 pip install fire 下。

          可以把你的函數(shù)直接變成命令行接口:

          import fire

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

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

          然后在命令行,就可以執(zhí)行這些命令:

          python hello.py  # Hello World!
          python hello.py --name=David  # Hello David!
          python hello.py --help  # Shows usage information.

          也可以把可以把你的類直接變成命令行接口:

          import fire

          class Calculator(object):
            """A simple calculator class."""

            def double(self, number):
              return 2 * number

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

          然后就可以這樣執(zhí)行:

          python calculator.py double 10  # 20
          python calculator.py double --number=15  # 30

          除此之外,還有這樣的功能:

          執(zhí)行后自動(dòng)進(jìn)入交互模式:

          command -- --interactive

          比如:

          查看執(zhí)行的調(diào)用順序:

          python arg_demo2.py double 10 -- --trace

          結(jié)果如下:

          還可以為你生成 shell 自動(dòng)補(bǔ)全命令的腳本,真的很貼心:

          python arg_demo2.py double 10 -- --completion

          2. mando

          mando 是一個(gè)基于 argparse 的裝飾器,可以讓你在幾秒內(nèi)編寫出一個(gè)靈活、可維護(hù)的命令行工具。

          使用前先 pip install mando 下。

          用法:

          example.py

          from mando import command, main

          @command
          def echo(text, capitalize=False):
              '''Echo the given text.'''
              if capitalize:
                  text = text.upper()
              print(text)

          if __name__ == '__main__':
              main()

          命令行用法:

          $ python example.py -h
          usage: example.py [-h] {echo} ...

          positional arguments:
            {echo}
              echo      Echo the given text.

          optional arguments:
            -h, --help  show this help message and exit

          $ python example.py echo -h
          usage: example.py echo [-h] [--capitalize] text

          Echo the given text.

          positional arguments:
            text

          optional arguments:
            -h, --help    show this help message and exit
            --capitalize

          真實(shí)執(zhí)行結(jié)果:

          $ python example.py echo spam
          spam
          $ python example.py echo --capitalize spam
          SPAM

          再?gòu)?fù)雜一點(diǎn)的:

          from mando import command, main


          @command
          def push(repository, all=False, dry_run=False, force=False, thin=False):
              '''Update remote refs along with associated objects.

              :param repository: Repository to push to.
              :param --all: Push all refs.
              :param -n, --dry-run: Dry run.
              :param -f, --force: Force updates.
              :param --thin: Use thin pack.'''


              print ('Pushing to {0}. All: {1}, dry run: {2}, force: {3}, thin: {4}'
                     .format(repository, all, dry_run, force, thin))


          if __name__ == '__main__':
              main()


          mando 可以理解 Sphinx 風(fēng)格的文檔字符串中的 :param 參數(shù)說明,因此可以顯示幫助文檔。

          $ python git.py push -h
          usage: git.py push [-h] [--all] [-n] [-f] [--thin] repository

          Update remote refs along with associated objects.

          positional arguments:
            repository     Repository to push to.

          optional arguments:
            -h, --help     show this help message and exit
            --all          Push all refs.
            -n, --dry-run  Dry run.
            -f, --force    Force updates.
            --thin         Use thin pack.

          mando 還可以理解 Python3 的類型提示,因此傳錯(cuò)了參數(shù),也會(huì)有報(bào)錯(cuò)提示:

          from mando import command, main


          @command
          def duplicate(string, times: int):
              '''Duplicate text.

              :param string: The text to duplicate.
              :param times: How many times to duplicate.'''


              print(string * times)


          if __name__ == '__main__':
              main()

          執(zhí)行:

          $ python3 test.py duplicate "test " 5
          test test test test test
          $ python3 test.py duplicate "test " foo
          usage: test.py duplicate [-h] string times
          test.py duplicate: error: argument times: invalid int value: 'foo'

          最后的話

          本文分享編寫建命令行工具的三方庫(kù),使用起來(lái)非常簡(jiǎn)單,我也是偶然在 GitHub 搜索到的,寫代碼前先在 GitHub 上搜一下真的是一個(gè)很好的習(xí)慣,如果覺得有收獲,歡迎點(diǎn)贊、再看、轉(zhuǎn)發(fā)、關(guān)注「Python七號(hào)」,每周學(xué)習(xí)一個(gè)小技術(shù)。

          留言討論


          瀏覽 54
          點(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>
                  美女高潮视频网站 | 久久久13 | 日本在线观看一区 | 大陆美女操逼网站 | 日韩一级欧美一级片 |