よちよちpython

独習 python/Qpython/Pydroid3/termux/Linux

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

今回は、自作のPythonライブラリをCLIに出来る方法で他のファイルにインポート出来るのか?を確認します。

前々回
即席CLIツールを作る



前回
作成と動作確認の操作記録



に続き、第三弾。だいぶん手馴れて来ました。

目次




実行環境




ディレクトリ構成


まずは、適当な場所にフォルダを作り、その中に

  • 実行したい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」をfromimportのどちらに書いても読み込まれない。
結局、

  • 呼び出すファイルを保存したディレクトリ「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環境で同じように実行できるか確認できたら追記します。

以上です。