よちよちpython

独習 python/Qpython/Pydroid3/termux/Linux

PythonでCLIツールを作る其の2コマンド記録

前回のつづき。



目次




実行環境


  • Android
  • Termux(ターミナルアプリ)
  • Python3.9



今回の目的と狙い


前回は自作のPythonプログラムからCLIツールを簡潔に作成した。
問題としてはパッケージの名前が「UNKNOWN」になってしまったので、今回は

  • setup.pyを改良してパッケージ名を任意のものに変える
  • それから、呼び出す関数がreturnでも出力されるかどうか
  • コマンド名とプログラム内容が変更できるか

も調べます。



方法


  • Termux(ターミナルアプリ)でのコマンド入力記録をつらつらと書いていきます。
  • 途中の「$」はコマンド入力の部分です。その直ぐ下にターミナルの表示通りに出力を書きます。

  • 作業ディレクトリはTermuxのデフォルトのホームディレクトリに「MyApp」というディレクトリを作ってその中で行います。

  • 作るファイルは2つ
    • 動かすPythonプログラムファイル(ppp.py)
    • CLIツール作成用ファイル(setup.py)



  • プログラムファイルの変更等は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

変更が効く。動いた。



インストールする時のコマンドは

  1. python setup.py develop
  2. 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



今回は以上。


続き

PythonでCLIツールを作る其の3別ファイルへのインポート確認 - よちよちpython