PythonでCLIツールを作る其の2コマンド記録
前回のつづき。
目次
実行環境
- Android
- Termux(ターミナルアプリ)
- Python3.9
今回の目的と狙い
前回は自作のPythonプログラムからCLIツールを簡潔に作成した。
問題としてはパッケージの名前が「UNKNOWN」になってしまったので、今回は
setup.py
を改良してパッケージ名を任意のものに変える- それから、呼び出す関数が
return
でも出力されるかどうか - コマンド名とプログラム内容が変更できるか
も調べます。
方法
- Termux(ターミナルアプリ)でのコマンド入力記録をつらつらと書いていきます。
- 途中の「
$
」はコマンド入力の部分です。その直ぐ下にターミナルの表示通りに出力を書きます。 - 作業ディレクトリはTermuxのデフォルトのホームディレクトリに「MyApp」というディレクトリを作ってその中で行います。
- 作るファイルは2つ
- プログラムファイルの変更等はVim(エディタ)で行いましたが、その入力記録は記していません。
実験
作業ディレクトリの作成と移動
$ mkdir MyApp $ cd MyApp
カレントディレクトリ確認
$ pwd /data/data/com.termux/files/home/MyApp
ディレクトリ構成
$ tree (MyApp) . ├── ppp.py └── setup.py 0 directories, 2 files
ファイルの中身の確認
CLIツールにする実行用ファイル
$ cat ppp.py
def greet(): return "HELLO WORLD !!"
return
で文字列を返している。通常、出力表示させるにはprint関数に渡すなどの必要がある。
インストール用ファイル
$ cat setup.py
from setuptools import setup setup( name="SAMPLE", version="0.0.1", install_requires=[], entry_points={ "console_scripts": [ "zzz = ppp:greet" ] } )
- 「name」 : パッケージ名(pip listに表示される名前)
- 「version」 : 「0.0.1」は適当に手書き。
- 「install_requires」: importする"ライブラリ名"をリストで書く。今回は無し。
entry_points
の"console_scripts"
- 「zzz」 : コマンド名
- 「ppp」: コマンドで呼び出すpyファイル
- 「greet」: コマンドで呼び出す関数名
「zzz」とコマンド入力すると、「ppp.py」の「greet()」関数が実行される。
インストールしてCLIツール作成
「setup.py
」「ppp.py
」を入れたディレクトリ内で、下記のコマンドを打つ。
$ python setup.py develop running develop running egg_info creating SAMPLE.egg-info writing SAMPLE.egg-info/PKG-INFO writing dependency_links to SAMPLE.egg-info/dependency_links.txt writing entry points to SAMPLE.egg-info/entry_points.txt writing top-level names to SAMPLE.egg-info/top_level.txt writing manifest file 'SAMPLE.egg-info/SOURCES.txt' reading manifest file 'SAMPLE.egg-info/SOURCES.txt' writing manifest file 'SAMPLE.egg-info/SOURCES.txt' running build_ext Creating /data/data/com.termux/files/usr/lib/python3.9/site-packages/SAMPLE.egg-link (link to .) Adding SAMPLE 0.0.1 to easy-install.pth file Installing zzz script to /data/data/com.termux/files/usr/bin Installed /data/data/com.termux/files/home/MyApp Processing dependencies for SAMPLE==0.0.1 Finished processing dependencies for SAMPLE==0.0.1
setup.py
の「name」を「SAMPLE」にしたのでパッケージ名がそれになっている。
インストールされたようだ。
pip listで確認する
下記のgrep
以下は、出力の中からパッケージ名「SAMPLE」に該当するものを抽出している
$ pip list | grep SAMPLE SAMPLE 0.0.1 /data/data/com.termux/files/home/MyApp
ありました。
カレントディレクトリの中身を確認
$ ls SAMPLE.egg-info/ ppp.py setup.py
「SAMPLE.egg-info/」が自動作成されている。
「.egg-info」の前にパッケージ名がつく。
インストール後のディレクトリ構成
$ tree . ├── SAMPLE.egg-info │ ├── PKG-INFO │ ├── SOURCES.txt │ ├── dependency_links.txt │ ├── entry_points.txt │ └── top_level.txt ├── ppp.py └── setup.py 1 directory, 7 files
自動作成されたフォルダ内に5つのファイルが自動作成されている。
コマンド実行
完成したCLIツールのコマンドを入力する。
$ zzz HELLO WORLD !!
上手く行った。
「ppp.py」の「greet()」関数はreturn
文でしたが、なぜか文字列を表示しました。
他のディレクトリに移動しても実行できることを確認した(省略)。
プログラムやコマンド名の変更と動作確認
インストールされたままの状態で、内容の変更が可能か確かめる。
自動作成されたファイルの中身を見る。
$ cat SAMPLE.egg-info/entry_points.txt [console_scripts] zzz = ppp:greet
コマンド名の変更
entry_points.txt
を書き換えてみる。
$ cat SAMPLE.egg-info/entry_points.txt [console_scripts] hihihi = ppp:greet
コマンド名「zzz」を「hihihi」に書き換えた。
$ hihihi hihihi: command not found
変更が効かない。あれ、おかしいな…前回は出来たのだけど…
戻して、プログラムの方を書き換える。
プログラムの書き換え
コマンド名を戻す。変更が効かないようなので。
$ cat SAMPLE.egg-info/entry_points.txt [console_scripts] zzz = ppp:greet
呼び出すプログラムを書き換える
$ cat ppp.py def greet(): return "468*&*+%$57+-:!!*&4"
出力させる文字列を「HELLO WORLD !!」から更に適当なものに書き換えた。
コマンド入力
$ zzz 468*&*+%$57+-:!!*&4
変更が効く。動いた。
インストールする時のコマンドは
- python setup.py develop
- pip install -e .
の2種類のどちらでも出来る。だが、その違いが分からない。
上記は(1. )で行ったので、次にアンインストールし、(2. )の方法で再インストールして違いを探る。
アンインストール
setup.pyとppp.pyを保存しているディレクトリMyAppに戻り、下記を実行する。
$ python setup.py develop -u running develop Removing /data/data/com.termux/files/usr/lib/python3.9/site-packages/SAMPLE.egg-link (link to .) Removing SAMPLE 0.0.1 from easy-install.pth file
アンインストールされた。通っていたパスの設定が削除されたようです。
pip list
でインストール済みライブラリを確認したが無事に削除されている。ただし、カレントディレクトリに自動作成されたフォルダ「SAMPLE.egg-info」とその中の5つのファイルは削除されない。必要なければ手動で消す。アンインストール時に自動で削除するものを指定できるようだが、今回はそれは未確認。
別の方法で再インストール
インストールの2番目の方法で再インストールする。コマンド名などはそのままだが、コマンドで呼び出す関数の出力内容だけは変更してある状態。
$ pip install -e . Obtaining file:///data/data/com.termux/files/home/MyApp Installing collected packages: SAMPLE Running setup.py develop for SAMPLE Successfully installed SAMPLE
CLIを実行
$ zzz 468*&*+%$57+-:!!*&4
動く。
entry_points.txtの内容を変更して確認
インストール後にコマンド名が変更可能か確かめる為に、SAMPLE.egg-info/entry_points.txtの内容をエディタで変更し(省略)、変更内容を出力する。
$ cat SAMPLE.eggs-info/entry_points.txt [console_scripts] ponkotsu = ppp:greet
コマンド名を「zzz」から「ponkotsu」に変更した。
コマンド変更が効くか確認
$ ponkotsu ponkotsu: command not found
変更が効かない。あれ、おかしいな。前回は出来たのに(2回目)…
その他、呼び出す関数名の「greet」を別なものに変えたりして変更可能か確認したが効かない。あれ、おかしいな…
コマンド名は「zzz」に戻す。
アンインストール
再インストールしたものを早くもアンインストールする。
通常のpip uninstall
コマンドで行ってみる。
$ pip uninstall SAMPLE Found existing installation: SAMPLE 0.0.1 Uninstalling SAMPLE-0.0.1: Would remove: /data/data/com.termux/files/usr/bin/zzz /data/data/com.termux/files/usr/lib/python3.9/site-packages/SAMPLE.egg-link Proceed (y/n)? y Successfully uninstalled SAMPLE-0.0.1
アンインストール成功。
上記に「/data/data/com.termux/files/usr/bin/zzz」と書かれた部分があるね。コマンド名の「zzz」がパスに含まれている。ということは、どういうこと?
カレントディレクトリの「SAMPLE.egg-info/」とファイルは削除されず。
アンインストール後のコマンド実行
$ zzz bash: /data/data/com.termux/files/usr/bin/zzz: No such file or directory
今回は以上。
続き