PythonでCLIツールを作る其の3別ファイルへのインポート確認
今回は、自作のPythonライブラリをCLIに出来る方法で他のファイルにインポート出来るのか?を確認します。
前回
作成と動作確認の操作記録
に続き、第三弾。だいぶん手馴れて来ました。
目次
実行環境
- Android
- Termux
- Python3.9
ディレクトリ構成
まずは、適当な場所にフォルダを作り、その中に
- 実行したいpyファイル
- インストール用setup.py
の2つを作ります。
$ mkdir apps ←フォルダ「apps」作成 $ cd apps ←「apps」に移動 $ touch {"test", "setup"}.py ←2つの空ファイル作成
$ tree . │ ├── setup.py └── test.py 0 directory, 2 files
ファイル作成
実行するプログラムファイル
呼び出す関数の載ったファイルです。
コマンドライン引数のリストを取得したら、それぞれの引数を逆順に読み、リストで返します。
test.py
import sys def main(): args = sys.argv if len(args) == 1: return "INPUT ARGS" else: return [i[::-1] for i in args[1:]] if __name__=="__main__": print(main())
プログラムが動くか確かめる。
$ python test.py コマンドライン引数 ['数引ンイラドンマコ']
インストール用ファイル
setup.py
from setuptools import setup setup( name="rev", version="0.0.1", install_requires=[], entry_points={ "console_scripts": [ "rev = test:main" ] } )
全部適当に
- 「name」パッケージ名:rev
- version : 0.0.1
- "console_scripts":
- コマンド名 : rev
- 呼び出すファイル : test.py
- 呼び出す関数 : main()
これで、パッケージ名「rev」 version==0.0.1ができます。
「test.py」の「main()」関数を、「コマンド名 rev」か別ファイルでインポートできるようになります。
インストール
作ったsetup.pyとtest.pyの入ったappsディレクトリで、以下の2つのどちらかをコマンドする。
$ python setup.py develop または $ pip install -e .
インストール成功したら
ディレクトリに、中に5つのファイルが入った「rev.egg-info/」というフォルダが自動作成されます。
pip list
コマンドで、パッケージ「rev==0.0.1」が追加されているのが確認できます。
CLIツールの実行
出来上がったCLIツールを実行します。
$ rev MAKE AMERICA GREAT AGAIN ['EKAM', 'ACIREMA', 'TAERG', 'NIAGA']
グッド👍 動きました。
引数なしで実行すると「INPUT ARGS」と表示されます。
別のディレクトリでもコマンドが実行できることを確認しました。
他のファイルにインポート
念のため別のディレクトリに移動し、自作パッケージ「rev」の「main()」関数がファイルにインポートできるか確認します。
$ cd .. ←上の階層に移動 $ touch sample.py ← 空ファイル作成
【重要】インポートで呼び出す際の書き方
重要
上手くインポートされずに何度も書き直した。
sample.py の中身
from apps import test print(test.main())
パッケージ名「rev」をfrom
やimport
のどちらに書いても読み込まれない。
結局、
- 呼び出すファイルを保存したディレクトリ「apps」の中にある、
- 「test.py」というファイルの、
- 「main()」関数
を呼び出す上記のような書き方をしないと
from rev import test ModuleNotFoundError: No module named 'rev'
等とErrorが出る。
または、単に
import test print(test.main())
でも動く。だがもう少し特徴的な名前を付けないと「test」では何処のどなたなのかが分かりませんね。
パッケージ化の際の注意点
以上のことから、
パッケージ名
と作業用ディレクトリ名
は同じにしておくべき- または
パッケージ名
と呼び出すファイル名
は同じにしておくべき
でした。パッケージ名=ファイル名がベストかな。探しやすい、使いやすい。
インポートしたプログラムの動作を確認します。
$ python sample.py その批判にはあたらない ['いならたあはに判批のそ']
おわりに
前々回・前回を含め、自作のPythonファイルからCLIツールが作れて、他のファイルへライブラリとしてインポートして使い回しできるようになった。だいぶん自分の中でレベルアップした気がする。使える道具を得た、という感じ。
あとは、配布できるようなパッケージ化の方法を探ることと、配布する価値のあるプログラムを書くこと。一番難しい🤭
この続きはもっと後になるかな。
Windows環境で同じように実行できるか確認できたら追記します。
以上です。