動機
以前、実行環境も一つのフォルダー以下に収められる可搬的なPythonスクリプトのスケルトン作成ユーティリティ(py_canister)というのを作成した。可搬的なものとするために、1つの実行スクリプトのファイルの中に、新たに作成するPythonスクリプトのテンプレートを可読性よく収めるためにシェルスクリプト(bash)で実装していたが、最近のLinuxディストリビューションによってはデフォルトシェルがbashでないものもあったり、シェルスクリプトでの拡張性に限界を感じていた。
Pythonのスクリプトを作成するので、Pythonがインストールされている環境で使用することは前提とできるのと、最近になってPythonスクリプトに長いテキストデータを可読性を保ちつつ埋め込む方法(embedded-text)を思いついたので、この手法をつかってPythonで書き直すことにした。
仕様
実現したいことは、
- 新たに
Pythonスクリプトを書くときに、いつも最初にすること(ディレクトリ構造の作成、スクリプトファイルの作成と「定型事項」の書き込み)を自動化 - 必要な
Pythonモジュールをpipでローカルにインストールする. (pip --target ...のやり方を覚えなくても良いようにする) - ローカルに
pipでインストールしたPythonモジュールを容易にクリーンナップ可能にする - Pythonスクリプトが参照するデータファイルもを置くローカルディレクトリも容易に作成
- 実行時に自動で
Pythonモジュールをローカルにインストールしたディレクトリを環境変数PYTHONPATHに加える - 作成した
Pythonスクリプトを含むディレクトリのgitへの登録を自動化. (gitのコマンドなどをおぼえなくても良いようにする) - 作成した
Pythonスクリプトを含むディレクトリをコピーするだけで、他のホストにも持っていけるようにする
ファイル置き場
pythonによって書き直すにあたって、ツール名を新しくpy-encaseに改名した。
実体は1ファイルなので、そのままコピーすればいいのですが、pip(PyPI)に登録したので、コマンド叩けば楽に持ってこれるようにできました。
# PyPIから`py-encase`ツールをローカルフォルダに持ってくる。
# 権限があれば、pipでシステムグローバルにインストールすることももちろん可能
% mkdir -p "${workdir}"/py_sandbox
% pip install --target "${workdir}"/py_sandbox py-encase
Collecting py-encase
Downloading py_encase-0.0.10-py3-none-any.whl.metadata (7.1 kB)
Downloading py_encase-0.0.10-py3-none-any.whl (47 kB)
Installing collected packages: py-encase
Successfully installed py-encase-0.0.10
まず、作成された${workdir}/py_sandbox/bin/py_encaseもしくは${workdir}/py_sandbox/py_encase/py_encase.pyを使います。
使用方法
py_encase.pyの2つの動作モード
-
manageモード
コマンドラインから、
-py_encase(.py)がまず--manageオプションをつけて起動されたとき
-mng_encaseという名前のシンボリックリンクから起動されたとき
には、実行環境構築の構築、pipによるPythonモジュールのインストールや実行スクリプトのテンプレートの作成など、指定されたサブコマンドに基づく動作をします.manageモードでのヘルプメッセージ% env PYTHONPATH="${workdir}"/py_sandbox: \ "${workdir}"/py_sandbox/bin/py_encase --manage -h usage: py_encase --manage [-p PREFIX] [-P PYTHON] [-I PIP] [-G GIT_COMMAND] [-v] [-n] [-h] {info,contents,init,add,addlib,addkv,newmodule, update_readme,init_git,clean,distclean,selfupdate, install,download,freeze,inspect,list,cache,piphelp} ... positional arguments: {info,contents,init,add,addlib,addkv,newmodule,update_readme,init_git,clean, distclean,selfupdate,install,download,freeze,inspect,list,cache,piphelp} info Show information contents Show file list init Initialise python script environment add add new python script files addlib add new python library-script files addkv add new KIVY (KV-language) files newmodule add new python-module source update_readme Update readme file init_git Initialise git repository clean clean-up of the working environment distclean Entire clean-up of the working environment selfupdate Self update of py_encase.py install PIP command : install download PIP command : download freeze PIP command : freeze inspect PIP command : inspect list PIP command : list cache PIP command : cache piphelp PIP command : help options: -p PREFIX, --prefix PREFIX prefix of the directory tree. (Default: Grandparent directory if the name of parent directory of py_encase is bin, otherwise current working directory. -P PYTHON, --python PYTHON Python path / command -I PIP, --pip PIP PIP path / command -G GIT_COMMAND, --git-command GIT_COMMAND git path / command -v, --verbose Verbose output -n, --dry-run Dry Run Mode -h, --help -
runモード
コマンドラインから、
-py_encase.pyが--manageオプション無しで起動されたとき
-mng_encase以外の名前のシンボリックリンクから起動されたとき
には、適切に環境変数PYTHONPATHを設定した上で、指定されたスクリプトを実行します。runモードでのヘルプメッセージenv PYTHONPATH="${workdir}"/py_sandbox: "${workdir}"/py_sandbox/bin/py_encase -h usage: python [option] ... [-c cmd | -m mod | file | -] [arg] ... ... Arguments: file : program read from script file - : program read from stdin (default; interactive mode if a tty) arg ...: arguments passed to program in sys.argv[1:]
これを踏まえて、下記の使用方法を参照してください。
(1) 新しいスクリプトを作成する環境の構築(init)
まずは、manageモードの、サブコマンドinitを使用します。実はこれ以降の操作もinitサブコマンドのオプション引数で指定すると一気にできますが、ここでは段階を追って作業する方法を説明します。
下記は、"${workdir}"/my_new_toolsというディレクトリを作成して、その下にスクリプト作成/実行環境を用意します。
% env PYTHONPATH=$workdir/py_sandbox: "${workdir}"/py_sandbox/bin/py_encase \
--manage init --prefix "${workdir}"/my_new_tools -v
[.....] mkdir -p : '${workdir}/my_new_tools'
[.....] mkdir -p : '${workdir}/my_new_tools/bin'
[.....] mkdir -p : '${workdir}/my_new_tools/var'
[.....] mkdir -p : '${workdir}/my_new_tools/src'
[.....] mkdir -p : '${workdir}/my_new_tools/var/tmp/python/packages/3.12.11'
[.....] mkdir -p : '${workdir}/my_new_tools/var/log'
[.....] mkdir -p : '${workdir}/my_new_tools/lib/python'
[.....] mkdir -p : '${workdir}/my_new_tools/lib/python/site-packages/3.12.11'
[.....] mkdir -p : '${workdir}/my_new_tools/var/cache/python/packages/3.12.11'
[.....] mkdir -p : '${workdir}/my_new_tools/src/python/packages/3.12.11'
[.....] mkdir -p : '${workdir}/my_new_tools/var/log/pip/25.1.1'
[.....] cp -ai '${workdir}/py_sandbox/py_encase/py_encase.py' '${workdir}/my_new_tools/bin/py_encase.py'
[.....] make symbolic link : '${workdir}/my_new_tools/bin/mng_encase' --> 'py_encase.py'
これにより、新しい作業ディレクトリ直下のbin("${workdir}"/py_sandbox/bin)に、py_encase.pyがコピーされ、このコピーへのシンボリックリンクmng_encaseが作成されました。以後の作業は、新たに作成された${workdir}/my_new_tools以下のファイルを使うことで作業できます。(最初につかった"${workdir}"/py_sandbox以下は消しても支障ありません。)
以後の作業では、環境変数PYTHONPATHの指定したかどうかを気にする必要はありません。また、mng_encase ...を実行すると、py_encase.py --manage ...と実行するのと同じ動作になるので、コマンドライン引数を指定する煩わしさからは少しだけ解放されます。
(2)新しいPythonスクリプトのテンプレート作成(add)
新たにPythonスクリプトを作成するため、my_worktool(.py)というスクリプトを用意してみます。その際、ファイル名だけを気にすればよく、どこのサブディレクトリに置くか、という心配は不要です。
% "${workdir}"/my_new_tools/bin/mng_encase add -v my_worktool
[.....] Preparing python library file from template : '${workdir}/my_new_tools/lib/python/my_worktool.py'
[.....] make symbolic link : '${workdir}/my_new_tools/bin/my_worktool' --> 'py_encase.py'
これにより${workdir}/my_new_tools/lib/python/my_worktool.pyが作成されるので、以後これに実際にスクリプトに付け加えたい機能を加えていくことになります。このスクリプトを実行するには、'${workdir}/my_new_tools/bin/my_worktool'という名前の'py_encase.py'へのシンボリックリンクを起動します。py_encase.pyは起動されると、シンボリックリンクの名前のファイルを${workdir}/my_new_tools/lib/python/から探して、そのファイルを環境変数PYTHONPATHを適切に設定した上で実行する。(runモードとして動作)
(3) 必要なPythonモジュールのインストール(install)
前節のテンプレートから作成されたPythonスクリプトは、非標準のPythonモジュール(pytz,tzlocal)を使っているので、これらをpipでインストールする必要があります。また、スクリプトを書き換えて別の非標準モジュールを使う場合には、それらもpipでとってくる必要があります。pipでローカルディレクトリにモジュールをインストールするには、いくつかコマンドラインオプションを指定するする必要がありますが、mng_encaseはその辺うまくやってくれます。
% "${workdir}"/my_new_tools/bin/mng_encase install pytz tzlocal
Collecting pytz
Downloading pytz-2025.2-py2.py3-none-any.whl.metadata (22 kB)
Collecting tzlocal
Downloading tzlocal-5.3.1-py3-none-any.whl.metadata (7.6 kB)
Downloading pytz-2025.2-py2.py3-none-any.whl (509 kB)
Downloading tzlocal-5.3.1-py3-none-any.whl (18 kB)
Installing collected packages: pytz, tzlocal
Successfully installed pytz-2025.2 tzlocal-5.3.1
% % find "${workdir}"/my_new_tools/lib/python/site-packages/ -maxdepth 2
...
${workdir}/my_new_tools/lib/python/site-packages/3.12.11/pytz
${workdir}/my_new_tools/lib/python/site-packages/3.12.11/tzlocal
...
findで見てわかるように、${workdir}/my_new_tools/lib/python/site-packages以下に使うpythonのバージョンごとに分けて置かれるので、pythonのバージョンごとの使い分けにも対応できます。
ここまでやって、前節で作成したテンプレートが実行できるようになります!
% "${workdir}"/my_new_tools/bin/my_worktool -d
Hello, ${workdir}/my_new_tools/lib/python/my_worktool.py! It is "Fri Sep 12 00:23:45 2025."
Python : 3.12.11 (.... /bin/python3.12)
1 : ${workdir}/my_new_tools/lib/python
2 : ${workdir}/my_new_tools/lib/python/site-packages/3.12.11
....
mng_encaseは、installのサブコマンド以下に与えられたコマンドライン引数と、--target,--logといったディレクトリ/ファイルを指定するコマンド引数をあわせてpipを
起動します。mng_encaseは、install以外にもdownload,freeze,inspect,list,cache,piphelp(pipのサブコマンドとしてはhelp)のサブコマンドが有効であり、それぞれ対応するpipのサブコマンドを実行します。
Pythonモジュールのインストールは、このサブコマンドの他にinit,add,addlibコマンドで-m(--module)オプションで指定することでも可能です。また、mng_encaseに用意されたテンプレートで使用されているモジュールを全部インストールするには、init,addサブコマンドの-O(--required-module)オプションが便利です。
(4) 自作のPythonのライブラリファイルの作成(addlib)
いくつかの実行ファイルでimportして使うライブラリ的に使うPythonファイルを作成したいばあいには、addlibコマンドが使えます。単純なクラス定義のテンプレートファイルを作成する点と、実行用のシンボリックリンクを作らないこと以外は、addサブコマンドとほぼ同じ動作です。
また、init,add,addlibのコマンドで-S(--std-script-lib)オプションを指定すると、いくつかのあらかじめ用意されているスクリプトライブラリファイルを作成します。
% "${workdir}"/my_new_tools/bin/mng_encase addlib -v my_worktool_util
[.....] Preparing python library file from template : '${workdir}/my_new_tools/lib/python/my_worktool_util.py'
(5) ReadMeファイルの作成/更新 (update_readme)
README.mdをテンプレートから生成するか、もしくは既存のものから、ファイルリストをアップデートします。
面倒なディレクトリ一覧、ファイル一覧を自動更新します。(完全ではないので、手動修正が必要とおもいますが、一からファイルリストを作成するよりも大幅に省力化できるとおもいます。)
% "${workdir}"/my_new_tools/bin/mng_encase update_readme -v -t 'My Worktool'
[.....] Save Readme file : '${workdir}/my_new_tools/README.md'
% cat "${workdir}"/my_new_tools/README.md
#
# My Worktool
#
Skeleton for small portable tools by python script
- Contents:
1. README.md: This file
2. bin/mng_encase: Symblic link to 'py_encase.py' for installing Python modules by pip locally.
3. bin/py_encase.py: Wrapper python script to invoke Python script. (Entity)
4. lib/python/site-packages/3.12.11: Directory where python modules are stored
5. var/cache/python/packages/3.12.11: Cache directory for module installation by pip
6. src/python/packages/3.12.11: Source directory for module installation for pip
7. var/log/pip/25.1.1: Log directory for module installation for pip
8. lib/python/my_worktool.py: Example Python script that use modules
9. bin/my_worktool: Symbolic link to 'py_encase.py' to invoke my_worktool.py.
10. lib/python/my_worktool_util.py: Example Python module file by template
- Usage (Procedure for adding new script):
...
README.mdの設置、アップデートは、このサブコマンドを呼ぶ代わりに、init,add,addlibなどで、-r(--readme)オプションを指定することで、Pythonファイル作成と同時にできます。
(6)gitによるバージョン管理のセットアップ(init_git)
多くの場合にはファイルのバージョン管理が必要で、最近はgitでバージョン管理するのが主流になっているとおもいますが、gitのレポジトリの初期化にはいくつかコマンドを叩く必要があり、そのやり方は忘れがちです。その辺ある程度init_gitで自動化できます。
% "${workdir}"/my_new_tools/bin/mng_encase init_git -v -n
[.....] gitignore : '${workdir}/my_new_tools/.gitignore'
[.....] put .gitkeep in '${workdir}/my_new_tools/lib/python/site-packages'
[.....] put .gitkeep in '${workdir}/my_new_tools/var/cache/python/packages'
[.....] put .gitkeep in '${workdir}/my_new_tools/src/python/packages'
[.....] put .gitkeep in '${workdir}/my_new_tools/var/log/pip'
[.....] put .gitkeep in '${workdir}/my_new_tools/var/tmp/python/packages'
[.....] Exec : '/usr/bin/git init ${workdir}/my_new_tools'
[.....] Exec : '/usr/bin/git config --file ${workdir}/my_new_tools/.git/config user.name ********'
[.....] Exec : '/usr/bin/git config --file ${workdir}/my_new_tools/.git/config user.email ********@****.*****.*****'
基本的な動作としては、
-
.gitignoreをテンプレートから作成 - 空ディレクトリをgit管理するためのダミーファイル(.gitkeep)を設置
- レポジトリの初期化(
git init) - ローカルにユーザー情報を登録
です。さらに-y(--git-set-upstream),-R(--git-remote-setup)オプションを指定すると、リモートレポジトリの設定も行うことができます。GitHubのCLI(gh),GitLabのCLI(glab)がセットアップされている環境下では、アカウント情報の取得やリモートレポジトリの作成で活用する試みも実装しつつあります。詳しくは"${workdir}"/my_new_tools/bin/mng_encase init_git -hで表示されるオプション引数の説明を確認してください。
gitのセットアップは、このサブコマンドを呼ぶ代わりに、init,newmoduleなどで、-g(--setup-git)オプションを指定することで、環境セットアップと同時に行うこともできます。
(7) 自作のPythonのモジュールの開発環境の作成(newmodule)
addlibサブコマンドのような単純なライブラリスクリプトよりも、さらに汎用的に使えるPythonモジュールを作成したい場合にはnewmoduleサブコマンドが有効です。
% "${workdir}"/my_new_tools/bin/mng_encase newmodule -v my_utility
[.....] mkdir -p : '${workdir}/my_new_tools/src/my-utility'
[.....] mkdir -p : '${workdir}/my_new_tools/src/my-utility/test'
[.....] mkdir -p : '${workdir}/my_new_tools/src/my-utility/src'
[.....] mkdir -p : '${workdir}/my_new_tools/src/my-utility/src/my_utility'
[.....] put .gitkeep in '${workdir}/my_new_tools/src/my-utility/test'
[.....] gitignore : '${workdir}/my_new_tools/src/my-utility/.gitignore'
[.....] Exec : '/usr/bin/git init ${workdir}/my_new_tools/src/my-utility'
[.....] Return code(/usr/bin/git): 0
[.....] STDOUT(/usr/bin/git) : 'Initialized empty Git repository in ${workdir}/my_new_tools/src/my-utility/.git/
'
[.....] Exec : '/usr/bin/git config --file ${workdir}/my_new_tools/src/my-utility/.git/config user.name ********'
[.....] Return code(/usr/bin/git): 0
[.....] Exec : '/usr/bin/git config --file ${workdir}/my_new_tools/src/my-utility/.git/config user.email ********@****.****.**'
[.....] Return code(/usr/bin/git): 0
[.....] Preparing README from template : '${workdir}/my_new_tools/src/my-utility/README.md'
[.....] Preparing LICENSE from template : '${workdir}/my_new_tools/src/my-utility/LICENSE'
[.....] Preparing Makefile from template : '${workdir}/my_new_tools/src/my-utility/Makefile'
[.....] Preparing pyproject.toml from template : '${workdir}/my_new_tools/src/my-utility/pyproject.toml'
[.....] Preparing __init__.py from template : '${workdir}/my_new_tools/src/my-utility/src/my_utility/__init__.py'
[.....] Preparing my_utility.py from template : '${workdir}/my_new_tools/src/my-utility/src/my_utility/my_utility.py'
モジュールの開発環境は、'${workdir}/my_new_tools/src/'以下に作成されます。モジュールの説明文等は、コマンドラインオプションで指定可能です。作成したPythonモジュールをこの実行環境の他のスクリプトから利用できるようにローカルにインストールするには、
% make -C "${workdir}"/my_new_tools/src/my-utility test_local
とすれば、モジュールソースから、他のpipでインストールされたモジュールと同様に、${workdir}/my_new_tools/lib/python/site-packages/以下にインストールされます。
(8) ファイルの一覧の作成 (contents)
作業環境の下に作成したファイルの一覧を表示する。'-a'('--all')で全てPythonファイルの一覧が見える。
% % "${workdir}"/my_new_tools/bin/mng_encase -v -n contents -v -n -a
Bin Scripts: ----------------------------------------
my_worktool.py
Lib Scripts: ----------------------------------------
my_worktool_util.py
Module source: ----------------------------------------
${workdir}/my_new_tools/src/my-utility
Module installed: ----------------------------------------
pytz : 2025.2 (${workdir}/my_new_tools/lib/python/site-packages/3.12.11)
tzlocal : 5.3.1 (${workdir}/my_new_tools/lib/python/site-packages/3.12.11)
(9) py_encase.pyのバージョンアップ(selfupdate)
最初にpy_encase --manage initすると、作業環境にpy_encase.pyがコピーされる。その後にPyPIにある最新版が出たときに、作業環境のpy_encase.pyをアップデートするためのサブコマンドがselfupdateである。
% "${workdir}"/my_new_tools/bin/mng_encase selfupdate -v
[.....] Exec: '..../pip-3.12 --python ..../bin/python3.12 install --cache-dir ${workdir}/my_new_tools/var/cache/python/packages/3.12.11 --log ${workdir}/my_new_tools/var/log/pip/25.1.1/pip-log.txt --target ${workdir}/my_new_tools/lib/python/site-packages/3.12.11 --src ${workdir}/my_new_tools/src/python/packages/3.12.11 --upgrade --force-reinstall py-encase'
Collecting py-encase
Using cached py_encase-0.0.11-py3-none-any.whl.metadata (7.1 kB)
Using cached py_encase-0.0.11-py3-none-any.whl (48 kB)
Installing collected packages: py-encase
Successfully installed py-encase-0.0.11
[.....] Exec: '..../bin/pip-3.12 --python ..../bin/python3.12 list --cache-dir ${workdir}/my_new_tools/var/cache/python/packages/3.12.11 --log ${workdir}/my_new_tools/var/log/pip/25.1.1/pip-log.txt --path ${workdir}/my_new_tools/lib/python/site-packages/3.12.11 --format json'
[.....] selfupdate: Current version=='0.0.10', Latest version=='0.0.11', Force install?: False
[.....] Move file: '${workdir}/my_new_tools/bin/py_encase.py' --> '${workdir}/my_new_tools/var/tmp/python/packages/3.12.11/py_encase-0.0.10.20250911_224544.py'
[.....] selfupdate: Backup current file: '${workdir}/my_new_tools/bin/py_encase.py' --> '${workdir}/my_new_tools/var/tmp/python/packages/3.12.11/py_encase-0.0.10.20250911_224544.py'
[.....] selfupdate: Copy file: '${workdir}/my_new_tools/lib/python/site-packages/3.12.11/py_encase/py_encase.py' --> '${workdir}/my_new_tools/bin/py_encase.py'
(10) 実行環境のクリーンアップ(clean, distclean)
実行環境を他のホストにコピーしたいといった状況で、一旦インストールしたモジュールを消去したりしたい場合には、clean,distcleanが使える。あらかじめ'-n'('--dry-run')オプションをつかって、自分が手動で追加したファイルを消すことがないか確認し、必要なファイルは退避させてから実行してほしい。
% "${workdir}"/my_new_tools/bin/mng_encase clean -v -n
[.....] clean : '${workdir}/my_new_tools/lib/python/site-packages/3.12.11,
${workdir}/my_new_tools/var/cache/python/packages/3.12.11,
${workdir}/my_new_tools/src/python/packages/3.12.11,
${workdir}/my_new_tools/var/log/pip/25.1.1,
${workdir}/my_new_tools/var/tmp/python/packages/3.12.11'
[.....] Remove file or symblic-link: '${workdir}/my_new_tools/lib/python/site-packages/3.12.11/py_encase-0.0.12.dist-info'
[.....] Remove file or symblic-link: '${workdir}/my_new_tools/lib/python/site-packages/3.12.11/pytz-2025.2.dist-info'
[.....] Remove file or symblic-link: '${workdir}/my_new_tools/lib/python/site-packages/3.12.11/bin'
[.....] Remove file or symblic-link: '${workdir}/my_new_tools/lib/python/site-packages/3.12.11/pytz'
[.....] Remove file or symblic-link: '${workdir}/my_new_tools/lib/python/site-packages/3.12.11/tzlocal-5.3.1.dist-info'
[.....] Remove file or symblic-link: '${workdir}/my_new_tools/lib/python/site-packages/3.12.11/py_encase-0.0.11.dist-info'
[.....] Remove file or symblic-link: '${workdir}/my_new_tools/lib/python/site-packages/3.12.11/py_encase'
[.....] Remove file or symblic-link: '${workdir}/my_new_tools/lib/python/site-packages/3.12.11/tzlocal'
[.....] Remove file or symblic-link: '${workdir}/my_new_tools/var/cache/python/packages/3.12.11/http-v2'
[.....] Remove file or symblic-link: '${workdir}/my_new_tools/var/cache/python/packages/3.12.11/selfcheck'
[.....] Remove file or symblic-link: '${workdir}/my_new_tools/var/log/pip/25.1.1/pip-log.txt'
[.....] Remove file or symblic-link: '${workdir}/my_new_tools/var/tmp/python/packages/3.12.11/py_encase-0.0.10.20250911_224544.py'
[.....] Remove file or symblic-link: '${workdir}/my_new_tools/var/tmp/python/packages/3.12.11/py_encase-0.0.11.20250912_021314.py'
% "${workdir}"/my_new_tools/bin/mng_encase distclean -v -n
[.....] distclean : '${workdir}/my_new_tools/lib/python/site-packages,
${workdir}/my_new_tools/var/cache/python/packages,
${workdir}/my_new_tools/src/python/packages,
${workdir}/my_new_tools/var/log/pip,
${workdir}/my_new_tools/var/tmp/python/packages'
[.....] Remove file or symblic-link: '${workdir}/my_new_tools/lib/python/site-packages/3.12.11'
[.....] Remove file or symblic-link: '${workdir}/my_new_tools/var/cache/python/packages/3.12.11'
[.....] Remove file or symblic-link: '${workdir}/my_new_tools/src/python/packages/3.12.11'
[.....] Remove file or symblic-link: '${workdir}/my_new_tools/var/log/pip/25.1.1'
[.....] Remove file or symblic-link: '${workdir}/my_new_tools/var/tmp/python/packages/3.12.11'
(12) よく使うパターンを盛りこんだPythonスクリプトのテンプレートの作成(add -F -O)
addサブコマンドで作成されるテンプレートはごくごく単純なものであるが、-F(--app-framework)オプションをつけると、ソフトウェアで典型的によく使われるパターンを含んだPythonスクリプトのテンプレートを作成する。また、-O(--required-module)オプションをつけると、そのために必要なPythonモジュールをpipでインストールする。いま盛り込んでいるパターンとしては、
- 各種データファイルを格納するためのディレクトリ構成の作成(
pkgstruct) - コマンドライン引数や設定ファイル(Config file)による実行パラメータの設定(
argparse_extd) - GUI画面の作成 (
kivy) - OSの機能を利用した通知メッセージの発出(
plyer) - Webサーバのパスワードなど、秘匿したいデータの暗号化したデータ保存(
enc_ds,sshkeyring)
である。注意点としては、通知の発出を機能させるためのplyerモジュールは、macOSではPythonのバージョンによっては、依存するpyobjusのインストールに失敗するが、いまのところPython-3.12では動作確認できている。 また、別途OSの設定で通知を許可させる設定する必要がある。初回起動後に、** macOSの場合、システム設定→通知→Pythonで、「通知を許可」をONにすると、次回以降通知が表示されるようになる。
`KIVY`によるGUIをサンプルに含んだので、kivyの設定ファイル(.kvファイル)のテンプレートを作成する、addkvサブコマンドも用意した。
% "${workdir}"/my_new_tools/bin/mng_encase add -v -F -O my_guitool
[.....] Preparing python library file from template : '${workdir}/my_new_tools/lib/python/my_guitool.py'
[.....] make symbolic link : '${workdir}/my_new_tools/bin/my_guitool' --> 'py_encase.py'
[.....] Preparing python library file from template : '${workdir}/my_new_tools/lib/python/streamextd.py'
[.....] KV file: '${workdir}/my_new_tools/share/my_new_tools/my_guitool.kv'
[.....] Exec: '.../bin/pip-3.12 --python .../bin/python3.12 install
--cache-dir ${workdir}/my_new_tools/var/cache/python/packages/3.12.11
--log ${workdir}/my_new_tools/var/log/pip/25.1.1/pip-log.txt
--target ${workdir}/my_new_tools/lib/python/site-packages/3.12.11
--src ${workdir}/my_new_tools/src/python/packages/3.12.11
pytz tzlocal pkgstruct argparse_extd psutil sshkeyring enc_ds plyer pyobjus kivy'
Collecting pytz
Using cached pytz-2025.2-py2.py3-none-any.whl.metadata (22 kB)
........
# 実行テスト
% "${workdir}"/my_new_tools/bin/my_guitool -v -g
[.....] private key passphrase for key_id="my_guitool@host.jp":
(初回起動時はここでデータ暗号化のためのパスフレーズを入力する)
[.....] Error : local_key can not be loaded
( key id: my_guitool@host.jp,
type: rsa : ${workdir}/my_new_tools/etc/my_new_tools/pki/private_keys/id_rsa_my_guitool_rsa)
[.....] Info ssh-add : ssh-agent ( key id: my_guitool@host.jp, type: rsa, sock : .....)
.....
[INFO ] [Logger ] Record log in ${workdir}/my_new_tools/etc/my_new_tools/kivy/logs/kivy_25-09-13_0.txt
.....
[INFO ] [Kivy ] Installed at "${workdir}/my_new_tools/lib/python/site-packages/3.12.11/kivy/__init__.py"
.....
[INFO ] [Logger ] Record log in ${workdir}/my_new_tools/var/log/my_new_tools/kivy_25-09-13_0.txt
.....
# 初回実行後、ssh-agentに、作成されたRSA鍵が登録されているはず
% ssh-add -L | grep -e 'my_guitool'
ssh-rsa AAAAB3.....== my_guitool@host.jp
# 初回実行後、OSの設定を行うと、2回目以降は通知が表示される。
% "${workdir}"/my_new_tools/bin/my_guitool -v -g
(13)実行環境の各種パラメータの表示(info)
環境変数(PYTHON,PIP,GIT,...)やコマンドラインオプションで、どのバージョンのPython,pipを使うかを選択することができる。infoサブコマンドでは、実行環境で実際に使われるpythonやpipなどの情報や、実行環境下でのディレクトリ構成などが表示される。
% "${workdir}"/my_new_tools/bin/mng_encase info
py-encase (Version: 0.0.13 : ${workdir}/my_new_tools/bin/py_encase.py)
% "${workdir}"/my_new_tools/bin/mng_encase info -l
py-encase (Version: 0.0.13 : ${workdir}/my_new_tools/bin/py_encase.py)
PIP module name : py-encase
PIP module version : 0.0.13
Manage script name : mng_encase
Manage mode option : --manage
Description : py-encase (Version: 0.0.13 : ${workdir}/my_new_tools/bin/py_encase.py)
Python command : .../bin/python3.12
Python select : python3.12
Python full path : .../bin/python3.12
Command invoked : ${workdir}/my_new_tools/bin/mng_encase (LINK? : True )
This file : ${workdir}/my_new_tools/bin/mng_encase
(source) : ${workdir}/my_new_tools/bin/py_encase.py
Top of work directory : ${workdir}/my_new_tools
bin directory : ${workdir}/my_new_tools/bin
var directory : ${workdir}/my_new_tools/var
src directory : ${workdir}/my_new_tools/src
data directory : ${workdir}/my_new_tools/share
tmp directory : ${workdir}/my_new_tools/var/tmp/python/packages/3.12.11
log directory : ${workdir}/my_new_tools/var/log
script directory : ${workdir}/my_new_tools/lib/python
python module directory: ${workdir}/my_new_tools/lib/python/site-packages/3.12.11
PIP command : .../bin/pip-3.12
PIP full path : .../bin/pip-3.12
PIP cache directory : ${workdir}/my_new_tools/var/cache/python/packages/3.12.11
PIP src directory : ${workdir}/my_new_tools/src/python/packages/3.12.11
PIP log directory : ${workdir}/my_new_tools/var/log/pip/25.1.1
PIP log path : ${workdir}/my_new_tools/var/log/pip/25.1.1/pip-log.txt
Python shebang : #!/usr/bin/env python3.12
KIVY_HOME : ${workdir}/my_new_tools/share/my_new_tools
実践編
より実際的な使い方は、別記事にしたいと思います。