Python Fireを使用してUbuntu 22.04上でCLIを作成する方法を教えてください。
イントロダクション
Python Fireは、Pythonオブジェクトから自動的にCLI(コマンドラインインターフェース)を作成するためのPythonライブラリです。CLIは、コマンドラインからテキスト入力を受け取るプログラムであり、開発やデバッグのワークフローをサポートするのに役立ちます。これは、Bashやコマンドラインに慣れ親しんでいる人にとって便利です。
伝統的な方法である標準のPythonライブラリのargparseを使用することでも同じことができますが、Python Fireを使用するとプロトタイピングとメンテナンスが大幅に改善されます。完全な制御をしたい場合は、Pythonでコマンドラインプログラムを書くためのargparseの使い方に関するチュートリアルを参照してください。
このチュートリアルでは、Python Fireをインストールし、カスタムのコマンドラインインターフェース(CLI)を作成します。これらのCLIは、Pythonのソースコードに触れずに作成することができます。また、関数やクラスに直接結びつくよりも詳細なスクリプトを作成する場合には、Python Fireをインポートし、コード内で直接使用します。
前提条件
- An Ubuntu 22.04 server, set up according to our initial server setup guide for Ubuntu 22.04, with a non-root user with sudo privileges and a firewall enabled.
- The latest version of Python 3 installed on your machine with a virtual environment created, following how to install Python 3 and set up a programming environment on an Ubuntu 22.04 server.
- An familiarity with the Python language and how to code in it. A good primer would be this series on how to code in Python 3.
ステップ1:Python Fireのインストール
Python FireはPyPIでホストされ、pipからインストールできます。Python 3のインストールの前提条件に従って仮想環境を作成し、有効化する必要があります。有効にされていない場合は、環境ディレクトリに移動してください。
- cd environments
その後、仮想環境を有効にしてください。
- source my_env/bin/activate
仮想環境が有効になっている場合、fireをインストールすることで、グローバルなpipインストールに影響を与えることなく保証されます。さらに、aptなどのパッケージマネージャーとグローバルレベルでのpipインストールは予測不能に影響し合う可能性があります。
- pip install fire
火は複数の方法で呼び出すことができ、Pythonのプログラムにコードを追加することなくコマンドラインでも使用することができます。次に、その方法を試してみると同時に、Python Fireの通常の使用方法も探索します。これにより、より細かな制御を可能にするため、実際のコードにPython Fireを追加します。
ステップ2—コードの追加なしでプログラムからCLIを作成する
最初に、Pythonファイルを準備してください。これは「ファイル」「プログラム」「スクリプト」とも呼ぶことができます。
新しいファイルを作成するには、nanoまたはお好みのテキストエディタを使用してください。
- nano example.py
新しいファイルに以下のPythonコードを挿入してください。
def my_name(name):
return "My name is {name}".format(name=name)
ファイルを保存して終了します。nanoでこれを行うには、CTRL+O、CTRL+Xを押します。
これはPythonの関数で、my_nameという名前で、nameという1つの引数を受け取ります。必要な変数を使用してこの関数を呼び出すと、Pythonの文字列フォーマットを使用してname変数を文に挿入します。Pythonインタプリタでこのコードを実行する場合、変数としてsammyを使用すると、「私の名前はsammyです」と出力されます。
Python Fireを使用すると、PythonコードをCLIコマンドに変換し、Pythonコードを書かずに変数を挿入してコードを実行することができます。Pythonモジュールとして呼び出すために、新しいCLIコマンドを-mオプションを使用して入力してください。
- python -m fire example my_name –name=sammy
My name is sammy
ここでは、実行したいPythonプログラムの例として、my_nameという特定の関数を指定しています。my_nameは、nameと呼ばれる1つの引数を必要とする関数ですので、–nameフラグを使って引数を提供します。
あなたのPythonコードに何の変更も加えずに、基本的な動作が確認できるCLIが作成されました。
ステップ3 — fireをインポートしたプログラムからCLIを作成する
Python Fireを使用するよりも一般的な方法は、fireをコードにインポートすることです。これにより、CLI内での使用のために、より細かい制御や複雑なコードの構造化が可能になります。
以下のコードをexample.pyに挿入してください。
import fire
def my_name(name):
return "My name is {name}".format(name=name)
if __name__ == '__main__':
fire.Fire()
元のコードには2つの注目すべき変更点があります。最初に、fireが最初にインポートされます。その後、fire.Fire()の呼び出しが終わりで行われ、これによりCLIの機能が有効になります。これは、Pythonプログラムがユーザーによって直接実行された場合にのみ発生し、このファイルが別のPythonスクリプトにインポートされた場合には実行されません。my_name関数自体は変更されていません。
ファイルを保存して終了してください。
今、このコマンドを入力することでCLIを使用することができます。
- python example.py my_name sammy
My name is sammy
Pythonのコードの冒頭でfireモジュールをインポートするため、python -m経由でコマンドを呼び出す必要はもはやありません。それ代わりに、ファイルを直接呼び出して関数名と変数の引数を渡すことで、CLIを呼び出すことができます。
次に、実際のコードの修正が必要という犠牲を払いつつ、よりクリーンなCLI体験が提供されます。そして、Pythonプログラム全体ではなく、関数から直接CLIを作成します。
ステップ4 – 関数からCLIを作成する
プログラム内のすべての関数をCLIに公開する代わりに、特定の関数からCLIを作成することができます。次のコードをexample.pyに挿入してください。
「例えば、example.py」
import fire
def my_name(name):
return "My name is {name}".format(name=name)
def my_full_name(first_name, last_name):
return "My name is {first_name} {last_name}".format(first_name=first_name, last_name=last_name)
if __name__ == '__main__':
fire.Fire(my_name)
ファイルを保存して終了してください。
今回は2つの関数があります。オリジナルのmy_name関数と、新たに追加されたmy_full_name関数です。my_full_name関数は少し異なっていて、Python Fireが許容する柔軟性を持つ2つの引数を使用します。このチュートリアルの後で使用される予定です。
さらに、最後にfire.Fireが呼び出される際には、引数が必要になりました。使用したい関数を指定するためには、この引数に含める必要があります。この例では、my_nameがCLIの対象となるものです。
CLIで使用する関数を指定したため、コマンドラインで関数を実行するためには、プログラムと必要な引数のみを指定すればよいです。
- python example.py sammy
My name is sammy
出力では、指定したように、my_name関数のみが返されていることに気づいてください。新しいmy_full_name関数は変更されていません。
ただし、複数の関数をCLIに公開することができます。これを行うには、fire.FireコールにPythonの辞書を渡します。辞書をキーと値のデータ構造として使用することにより、CLIに複数の関数を指定することができます。この辞書には、CLIで使用したいすべての関数が含まれています。次のコードをexample.pyに挿入してください。
example.py
import fire
def my_name(name):
return "My name is {name}".format(name=name)
def my_full_name(first_name, last_name):
return "My name is {first_name} {last_name}".format(first_name=first_name, last_name=last_name)
if __name__ == '__main__':
fire.Fire({
'my_name': my_name,
'my_full_name': my_full_name,
})
今やCLIを通じて最初の機能を呼び出すことができます。
- python example.py my_name sammy
My name is sammy
あるいは、第二の関数には次のように名前を付けることもできます。
- python example.py my_full_name sammy shark
My name is sammy shark
今回の一つの変更点は、辞書の受け渡しです。辞書を使用することで、CLIからどちらの関数を呼び出すこともできます。次に、関数ではなくPythonクラスからCLIを作成します。
ステップ5 – クラスからCLIを作成します。
コードの構造はクラスや関数のどちらを選ぶかは好みおよびベストプラクティスへの個人的な遵守によるものです。Python Fireを使用してクラスからCLIを作成することは、関数から作成するよりも大幅に異なるものではありません。
クラスを作成するためには、コードを再編成し、関数をクラスの一部としてそれに配置する必要があります。以下をexample.pyに挿入してください。
import fire
class Namer(object):
def my_name(self, name):
return "My name is {name}".format(name=name)
def my_full_name(self, first_name, last_name):
return "My name is {first_name} {last_name}".format(first_name=first_name, last_name=last_name)
if __name__ == '__main__':
fire.Fire(Namer)
今、クラスを使うようにコードをリファクタリングしても、前のステップで使用した同じコマンドを使用して、CLIを介して最初の関数を呼び出すことができます。
- python example.py my_name sammy
My name is sammy
あるいは、あなたは第二の機能を呼ぶこともできます。
- python example.py my_full_name sammy shark
My name is sammy shark
作成されたCLIは、前のステップとまったく同じコマンドを使用して機能的に同等です。fire.Fireの呼び出しも同じです。変わったのは、コードの構造をクラスを使用するように変更しただけです。
Python Fireは、クラスや通常の関数を使用して、お好みの方法でコードを記述することができるように自分に合わせて適応します。
結論
このチュートリアルでは、Python Fireをインストールし、Pythonプログラム、関数、クラスを使用して独自のカスタムCLIを作成するための複数の方法を探索しました。さらに詳しい情報については、公式のドキュメンテーションをご覧ください。また、Pythonでコマンドラインプログラムを書くためのargparseの使用方法については、ガイドをご覧ください。