當前位置: 妍妍網 > 碼農

Python 命令補全工具 argcomplete

2024-05-27碼農

作者:YunfengWang

https://juejin.cn/post/7242676843987124279

1. 概述

在使用Python 命令或者 Python的命令列工具的時候,一個痛點是沒有補全。比如python -m後面輸入包名字,就沒有提示,每次想執行一個http server的時候,都需要搜尋一下http服務的包名。另外,像pip,pipx等命令也沒有提示,使用不太方便。

偶然看到 argcomplete [1] 這個庫,按tab鍵就可以給Python的命令列添加自動補全,簡直是使用Python的一個神器。

具體來說,argcomplete有下面的特點:

  • 官方支持支持bash和zsh兩種shell,對tcsh和fish有第三方貢獻者提供的支持(不好意思Windows使用者這裏又被當做二等公民了 )

  • 可以對python命令和pip命令進行補全

  • 其他任何以argparse解析的第三方包的命令都可以用自動補全,添加argcomplete的幾行程式碼就行

  • 下面具體展開怎麽對已有的工具啟用自動補全,以及如何讓自己的Python包支持argcomplete。

    2. 對Python和pip啟用自動補全

    首先透過pip命令來安裝argcomplete:

    pip install argcomplete

    然後執行下面的語句來啟用對Python和pip的自動補全:

    activate-global-python-argcomplete

    重新開機Shell,試試輸入pip然後按tab,發現就會列出所有的命令選項。

    3. 如何對別的第三方庫啟用自動補全

    有些庫的命令列程式是已經支持argcomplete補全,只需要用下面的命令來啟用:

    eval"$(register-python-argcomplete <python-app-name>)"

    例如 pipx 包安裝後會在系統安裝一個命令列程式pipx,且pipx已經支持argcomplete,我們就可以用下面的命令來啟用自動補全:

    eval"$(register-python-argcomplete pipx)"

    啟用後輸入pipx in 按tab鍵,就可以列出pipx所有以in開頭的命令,再按tab鍵會在各個候選命令之間切換。

    ⚠️註意:這個啟用命令是只對哪些程式碼中已經支持了argcomplete語句的程式才生效,如果程式碼中無這些語句,那是不生效的。

    4. 如何讓自己的Python庫支持自動補全

    只需要增加下面幾行程式碼,就能讓你的庫的命令列支持自動補全:

    # 在ArgumentParser物件初始化前增加這兩行
    # PYTHON_ARGCOMPLETE_OK
    import argcomplete, argparse
    # 原有程式碼
    parser = argparse.ArgumentParser()
    ...
    # 在呼叫parse_args()函式前增加這一行
    argcomplete.autocomplete(parser)
    # 原有程式碼
    args = parser.parse_args()
    ...

    然後你的包安裝後,對應的命令列程式就可以用eval "$(register-python-argcomplete )"來補全了。

    ⚠️註意:如果程式執行到argcomplete.autocomplete() 被呼叫的地方耗時很久的話,使用者按tab就會有明顯的延遲感。所以盡量將一些比較耗時的操作放在argcomplete.autocomplete() 語句後面,比如一些import語句,常常比較耗時,可以往後放。

    希望這個程式能讓你的Python開發變得舒服一些。

    參考資料

    [1]

    argcomplete: https://github.com/kislyuk/argcomplete

    - EOF -