Pythonコードからコマンドラインインターフェイスを自動生成するツール『Python Fire』を試してみた

2017.03.07

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

先日、Googleから『Python Fire』なるものが発表されました。関連記事によると『Pythonコードからコマンドラインインターフェイスを自動生成するツール』なのだそうです。ざっと見た感じ利用のハードルも低く、すぐに使えそうなものでしたので早速試してみました。

Python Fireの導入

Python Fireの導入方法及び使い方については下記GitHubの情報にまとまっています。こちらを参考にしながら進めて行きます。

検証環境にはAmazon Linux AMIの最新版を用いました。ログイン後の環境はPython2.7系がデフォルトで導入されています。

$ ssh -i xxxxxxxxx.pem ec2-user@xxx.xx.xxx.xx
$ sudo yum -y update
$ python --version
Python 2.7.12

GitHubの手順ではいきなりfireをpipインストールしていましたが手元で試した形だとエラーとなっていました。予め必要なライブラリをyumで導入後、pipでfireをインストールします。

$ sudo yum -y install python-devel
$ sudo yum -y install gcc
$ sudo pip install fire

Fireを使ったプログラミング実践

環境は整いました。fireパッケージをimportする形で、以下のようなサンプルプログラムを作成してみます(※GitHubのチュートリアル部分の内容をコピペ&追記したものになります)

calculator.py

import fire

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

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

  def hello(self, username):
   return "Hello, " + username + "!!"

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

作成したPythonプログラムにメソッド名/引数を渡す形で実行してみます。すると以下のような形で結果が返って来ました!

$ python calculator.py double 1000
2000
$ python calculator.py double --number=12345678
24691356
$ python calculator.py hello mesoko
Hello, mesoko!!

オプションで指定可能なものも幾つか用意されています。-- --helpでヘルプコマンドの表示。

$ python calculator.py -- --help
Type:        type
String form: <class '__main__.Calculator'>
File:        ~/calculator.py
Line:        3
Docstring:   A simple calculator class.

-- --verboseで利用方法も含めた詳細なヘルプコマンドの表示。

$ python calculator.py -- --verbose
Type:        Calculator
String form: <__main__.Calculator object at 0x7faa1f105e10>
File:        ~/calculator.py
Docstring:   A simple calculator class.

Usage:       calculator.py 
             calculator.py __class__
             calculator.py __delattr__
             calculator.py __dict__
             calculator.py __doc__
             calculator.py __format__
             calculator.py __getattribute__
             calculator.py __hash__
             calculator.py __init__
             calculator.py __module__
             calculator.py __new__
             calculator.py __reduce__
             calculator.py __reduce_ex__
             calculator.py __repr__
             calculator.py __setattr__
             calculator.py __sizeof__
             calculator.py __str__
             calculator.py __subclasshook__
             calculator.py __weakref__
             calculator.py double
             calculator.py hello

-- --completionでbash用のコマンドライン補完(command line completion)スクリプトを生成表示します。

$ python calculator.py -- --completion
# bash completion support for calculator.py
# DO NOT EDIT.
# This script is autogenerated by fire/completion.py.

_complete-calculatorpy()
{
  local start cur opts
  COMPREPLY=()
  start="${COMP_WORDS[@]:0:COMP_CWORD}"
  cur="${COMP_WORDS[COMP_CWORD]}"

  opts=""


  if [[ "$start" == "calculator.py" ]] ; then
    opts="double hello"
  fi

  if [[ "$start" == "calculator.py hello" ]] ; then
    opts="--self --username"
  fi

  if [[ "$start" == "calculator.py double" ]] ; then
    opts="--number --self"
  fi

  COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
  return 0
}

complete -F _complete-calculatorpy calculator.py

Python Fireの詳細な利用方法や解説についてはGitHubの下記ドキュメントをご参照ください。

まとめ

Pythonコードからコマンドラインインターフェイスを自動生成するツール、Python Fireのご紹介でした。インポート文1つでCLI利用のインタフェースが提供され、活用出来るというのはなかなかに便利な仕組みなのではと思います。日々の運用で活用しているスクリプトなどに盛り込んでみるのも良いかも知れません。