ターミナルで実行できるコマンドをPythonで作る
はじめに
ターミナルアプリを作るのに一番欠かせないのが、コマンドです。
自分で作ったアプリをコマンドでささっと起動できたらかっこいいですよね。
今回はPythonのパッケージ化に欠かせないsetup.pyを利用してコマンドを作っていきます。
ディレクトリ構成
hello-app
├── setup.py ←コマンドなどの設定
├── hello_app
│ ├── __init__.py ←インポート用の設定
│ └── hello_app.py ←メインとなるもの
├── README.md ←そのパッケージの説明など
├── LICENSE ←ライセンス(MITが一番)
├── .gitignore ←インストール時に除外したいファイル
└── hogehoge ← その他
└── etc
こんな感じにします。
ライセンスやREADMEファイルはインストールしたとしても、見る機会がほとんどないはずなので、主にGithubに上げるために用意します。
今回はあくまでもコマンドを作るのでここらへんは必要ありません。
また、.gitignoreというファイルにインストール時に除外したいファイル名を書いとくといいでしょう。
README.md
LICENSE
/hogehoge
みたいな感じで書きます。
実際に書いていく
実際に書いていきましょう。
モジュール
まずhello_app.pyとメインの方です。
def main():
print("Hello!")
あくまでもデモなので簡単にしました。コマンドで起動させるので処理は関数にまとめるようにします。
init.py
次に__init__.pyを書きます。
from hello_app import *
もっと細かく指定する方法はありますが、「*」が一番早いです。
setup.py
いよいよメインの話になりました。setup.pyはpythonをパッケージ化する時に欠かせない大切な設定ファイルです。詳しい書き方については色々な人が紹介していますので調べてみてください。
コマンドで起動させるためのsetup.pyの最低限な書き方は以下です。
from setuptools import setup
setup(
name='hello-task',
version='0.2',
packages=['hello-app'],
author='Staff Roi',
entry_points={
'console_scripts': [
'hello = hello_app.hello_app:main',
],
},
)
ほら、とてもeasyですよね。ポイントとなる部分はこれです。
entry_points={
'console_scripts': [
'コマンド名 = モジュールがあるディレクトリ名.モジュール名:関数名',
],
}
コマンドはいくつも指定できますが、オプションなどをつけたい時はsysのコマンド引数を受け取ってそこから判断させるようにするといいでしょう。
個人的に思うのですが、モジュール名やディレクトリ名には、なるべく特殊記号を使わないほうが良いと思います。(なんやかんや言ってエラーの原因になります)
インストール
setup.pyが無事書ければ、あとはインストールだけです。
まずターミナルまたはコマンドプロントを開き、hello-appディレクトリに移動します。
cd hello-app
そしてインストール!
sudo pip install .
無事インストールされました!
ターミナルにhelloとコマンドを入力すると...
おお、感激! これだけで自分だけのコマンドを作ることができました。
インストールオプション
ローカルの自作パッケージをインストールするとき、
pip install -e .
とするのが一番です。こうするとeditableモードという開発版モードでインストールされ、モジュールの内容を更新するとすぐにインストールされたパッケージに反映されるので、開発する時にとても便利です。
まとめ
今回はpythonのパッケージ化に欠かせないsetup.pyを利用して自作コマンドを作る方法を紹介しました。setup.pyのどこかがまずいと、開発者の思い通りに動作してくれないので、setup.pyをしっかり書くことはとても大切です。
コマンドでpythonプログラムをサクッと起動させるのとても便利なので、ターミナルアプリに関わらず、どんどん便利なコマンドを簡単に作ってしまいましょう!
Discussion