時々私達はそのような要件があります:
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があります。ようこそ参加してコミュニケーションするすべての人。