Pythonスクリプトのコマンドラインを生成するための2行のコード

時々私達はそのような要件があります:

Pythonメソッドを定義します。このメソッドはいくつかのパラメーターを受け入れますが、呼び出すときに、これらのパラメーターをコマンドラインで公開する必要があります。

たとえば、次のクロール方法があります。

import requests

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

ここでは、scrapメソッドが定義されています。最初のパラメーターはURL(クロールされたURL)を受け取り、2番目のパラメーターはタイムアウト(指定されたタイムアウト時間)を受け取ります。

電話をかけるときは、次のように電話することがあります。

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

パラメータをURLに変更したい場合は、コードを変更する必要がありますよね?

そのため、コマンドラインでこれらのパラメータを公開したい場合があります。現時点では、argparseなどのライブラリを使用する場合があります。各パラメータを1つずつ宣言するのは非常に面倒です。コードは次のとおりです。

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は臭くて書くのが長く、考えるのが難しいです。

しかし次に、2行のコードでこれを実行できるライブラリを紹介します。

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で、文字列Helloplusnameを出力します。

次に、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

ここでは、名前パラメーター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.py

SYNOPSIS
    demo2.py COMMAND

COMMANDS
    COMMAND is one of the following:

     double

ご覧のとおり、ここではCalculatorクラスのメソッドを認識し、コマンドの1つがdoubleです。呼び出してみましょう。

python3 demo2.py double

結果は次のとおりです。

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

ここで述べたように、ここではNUMBERという別のパラメーターを指定する必要があります。同時に、このパラメーターは引き続き必須パラメーターです。次を追加してみましょう。

python3 demo2.py double 4

結果は次のとおりです。

8

このとき、正しい結果を得ることができます。

したがって、一般に、fireはクラスコマンドラインにすることができ、各コマンドはメソッドの名前に対応し、追加のオプションまたは必須のパラメーターがコマンドラインパラメーターの後ろに追加されます。

リライト

最後に、戻って、最初に定義したスクレイプメソッドにコマンドライン引数のサポートを追加しましょう。

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 タイムアウトパラメータは次の方法で指定できます。

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

このようにして、両方のパラメーターを正常に割り当てることができ、最終的な効果は、5秒のタイムアウトでBaiduをクロールすることです。

どうですか?便利ですか?使ってみよう!プログラミングとPythonを学んでいる友達は、一人で暗闇から学ぶのは非常に困難です。ブロガーは過去の人でもあります。ここに、すべての人のための学習リソースと楽しいプロジェクトを用意した新しい控除グループ1020465983があります。ようこそ参加してコミュニケーションするすべての人。

おすすめ

転載: blog.csdn.net/weixin_56659172/article/details/124144207