これまでテキスト処理に特化したパッケージを作成してきたのですが、その目的がGrep検索ツールをつくることです。
今回は、そのツールをご紹介したいと思います。
なかなか手こずりましたし、これはC#のGUIで作った方がいいのではないかと途中で思いましたが、
PythonのTkinterではこの規模が限界なんだなというところまでは出来たと思います。
元々はC/C++などのコード解析ツールを作りたかったので、その途中で試作したツールみたいなものです。
しかし、動作は遅いのでご了承ください。
普通のエディタのgrepよりも処理速度は負けていますが、その検索結果のUI/UXを何とか工夫して見やすいように実装した形になります。
名前は「【Grep】CodeAnalyzer」として作成しましたので、少しは役に立つかとは思います。
プロジェクト
前回の「Python | 1. 汎用プログラム」で作成した「CodeAnalyzer」というプロジェクト内で作業します。
ファイルはその中で作成します。
見やすいように一つのファイルだけに集約しました。
ソースコード
下の画像のように追加してください。
名前は「【Grep】CodeAnalyzer.pyw」です。
以下がソースです。
ちなみに、今回のソースは拡張子が.pywになっています。
これはコンソールを表示しないという設定となっているので、GUIだけが表示することになります。
ですが、VSCodeのターミナルにはprint表示できるので問題はありません。
.pywのダウンロードはセキュリティ的にアウトなのでコピーでお願いします。
importするものとしてpandasとnatsortがあるのですが、これらは標準ライブラリではないため、
pipでインストールする必要があります。
以下のコマンドをコマンドプロンプトで打ってこの2つをインストールしてください。
pip install pandas
pip install natsort
また、pgming_packageのインポートなのですが、__init__.pyを読み込んでクラスとしてmodule_gui_text.pywを読み込んでいます。
この__init__.pyの中身はクラスメソッドとして追加したいモジュールを記述してください。
設計的にこのようにした方が管理しやすいので推奨します。
以下のように追加してください。
from . import fwmodule_general
from . import fwmodule_console_progress
from . import fwmodule_gui_progress
from . import module_console_text
from . import module_gui_text
今までパッケージに追加してきたモジュール群を追加しています。
これはPythonのライブラリを見ても分かるのですが、ライブラリもこのように__init__.pyとしてクラス型にしていますので参考にしてください。
【Grep】CodeAnalzyer.pywのソース解説ですが、色々と機能を盛り込んでかなり長くなるので端折ります。
インプットした項目のデータ保存先をJSON形式のファイルに格納しています。
このJSON形式は、幅広いアプリケーションで用いられているので汎用的なデータファイルにしようという意向です。
JSONファイルを確認して無かったらデフォルトで作成し、有ったら要素解析を行います。
これで準備万端なので、GUIアプリケーションクラスでFrameクラスをスーパークラスで継承し、それを用いてGUIを起動します。
最初に検索タブと結果タブを作成し、その両方に色々とウィジェットを追加します。
検索ボックス、パスボックス、ファイル拡張子ボックスを追加しています。
入力項目が全て埋まって「検索開始」ボタンでGrep検索を開始します。
読み込めないファイルはエラー文として書き出してlog出力します。
処理が終了したら結果タブで、
ツリーボックス、ファイルボックス、テキストボックス内に結果を表示します。
ショートカットキーを用いることで、
「Enter」キーならファイル内を表示し、「o」キーならファイルをエクスプローラー経由で開きます。
テキストボックス内では紫色で検索文字列が強調されているので分かりやすいかと思います。
また、”なんでpandasを使っているの?”と思っている方もいるかと思います。
これは今後のツールを作る上でデータ解析が優秀なので使っているだけです。
速度はそれほど変わりはありませんが、exe化すると重いので嫌という方は外して問題ないです。
ただのリスト型でデータ操作してください。
以上です。
デバッグ実行
では、実行してみましょう!
【Grep】CodeAnalyzer.pywが画面上に出ていることを確認して、「F5」キーを押します。
grep_config.jsonが自動で作成され、GUIが表示されますので入力項目を全て埋めて「検索開始」ボタンを押せば処理が開始します。
検索結果は「結果タブ」に表示されるのでそちらを見てください。
丁度いいテスト媒体(test_text.cpp)があるので、
試しにパスを当該パス「\」に設定し、拡張子を「*.cpp」にセット、
Grep検索文字列を「DirectX」にして「検索開始」ボタンを押します。
ショートカットキーでそのままEnterを押しても問題ありません。
以下のように検索が終了しました。
パイソンくんも「Comolete!!」と言ってくれています。
「結果タブ」をクリックして移動してください。
以下のように結果が表示されているかと思います。
一番上のリストボックスでツリー表示しているのですが、
この濃い緑を選択した状態で「Enter」を押すと一番下のテキストボックスでその行をファイルを開いて強調付きで表示してくれます。
また、以下のようにファイルを選択した状態で「o」キーを押すとエクスプローラー経由でファイルを開いてくれます。
このエクスプローラー経由というのがミソで、デフォルトで開けないファイルであれば、エクスプローラーに判断を委ねてどうやって開くかの選択ができるので、subprocessを扱う場合はこの方法が一番良いと思います。
exe化
ここで終わりではありません。
ツールは作れましたが、それを配布するにはどうすればいいのかが分からないかと思いますので、
その方法をご紹介させていただきます。
とその前にパッケージ内のrelease.pyでフラグをTrueにしてください。
これはexe化するときにインポートの仕方を切り替えるものとなっています。
# exe化フラグ
flag = True
# リリース用のインポートを行わなければパスが定まらずexeが正常に起動しない。
# デバッグ用は読み込み元プログラムでも読み込み先プログラムでも実行可能なルートパス可変制御を施している。
上記ができれば後はexe化です。
Pythonのソースをexe化するためには「PyInstaller」を用います。
ちなみに、これはコマンドプロンプトで簡単にできます。
まず、コマンドプロンプトを開いて以下のようにコマンドを打ってください。
pyinstaller [メインソースへのパス]
メインソースへのパスは「【Grep】CodeAnalyzer.pyw」です。
C:\CodeAnalyzer\【Grep】CodeAnalyzer.pyw
上記みたいな感じです。
Enterを押すと色々なオブジェクトファイル群と一緒にexeを生成してくれます。
終了するまで待ちましょう。
また、オプションで「--onefile」(※セキュリティ上、連続したハイフンは表せないのでご容赦を)というものがあります。
これはオブジェクトファイルを一つのexeとして生成するというものになりますが、
pandasやnumpyをインポートするものであれば、容量が大きくて起動がすごく遅くなるのでオススメしません。
エクスポートは以下のパスフォルダにあります。
C:\Users\[ユーザー名]\dist\
その中に「【Grep】CodeAnalyzer」というフォルダがあるので、
中身を見てみると、ファイル群の中に「【Grep】CodeAnalyzer.exe」というファイルがありますので、
起動してみて動かしてみて下さい。
このファイル群をいちいちコピーするのは嫌だなという方はショートカットを作成するか、
バッチファイルを作成してください。
batファイルの中身は以下にすると、「grep_config.json」と「grep_error.log」がそのbatファイルが置かれているディレクト内に作成されるので使いようによっては良いかと思います。
cd /d %~dp0
start C:\Users\[ユーザー名]\dist\【Grep】CodeAnalyzer\【Grep】CodeAnalyzer.exe
また、pandasを使わないよという方でインポートしない場合は、
「ーーonefile」(※セキュリティ上、連続したハイフンは表せないのでご容赦を)を使っても容量が大きかったり起動が遅くなることはありません。
その時は、「ーーexclude」(※セキュリティ上、連続したハイフンは表せないのでご容赦を)オプションでpandasとnumpyをexeに入れ込まないようにします。
「ーーonefile」(※セキュリティ上、連続したハイフンは表せないのでご容赦を)オプションだけだとpandasもnumpyも標準で入ってしまいます。(Pyinstallerの仕様上そうなっています)
なので、以下のようにして回避してください。
pyinstaller [メインソースへのパス] --onefile --exclude pandas --exclude numpy
zipファイル
以下はこれまで作ってきたモジュールが入っているパッケージと、【Grep】CodeAnalyzer.pyw、そのexeを起動させるバッチファイルをzipしたものになります。
まとめて欲しい人はここからダウンロードしてください。exeファイルは容量が大きすぎるので入っていません。
CodeAnalyzer.zip
まとめ
ここまでくれば、大体Pythonが出来るようにはなっていると思います。
案外、Perlと比べてもテキスト処理が優秀ですのでかなり重宝します。
また、PythonはDjangoなどのWebアプリケーションフレームワークでも使われているので、
今度はWeb系のものもアップしようかなと考えてます。