クーの自由研究

マスターの かえるのクーは8年の任期を終え消失しました。クーⅡ世の中の人絶賛募集中です。(特にオリオン座&プレイアデス方向の方は優遇します)助手がメイド喫茶から生還し、リハビリを兼ねて復帰しています。

10分でFIXするGIMP Python-Fuのプラグイン デバッグ

2匹目の どぜうの柳川 大盛で お吸い物付き 月見えずとも

でもやっぱりうなぎのかば焼きがいい、かえるのクーの助手の「井戸中 聖」(いとなか あきら)でございます。

f:id:np2LKoo:20210526230038j:plain

こちらの地方は曇りでとっても残念でした。12年後まで頑張って生きながらえます。

さて、先週までGIMPでPythonでのプラグイン作成ができることを知りませんでした。先週末はいろいろ調べたのですが、来週になったら全部忘れそうなので、記録しておきます。この道300年のLevel-MAXなPython-Fu達人のような書き方になりますことをお許しください。(さっきまだ知らなかったことを、ずっと知ってたスペシャリストであるかのように言及する、このブログのとても恥ずかしいスタイルです)

Python-Fuは最初さっぱいわからず、諸先輩にたいへん助けられました。

とくに、@dhomma様の記事が参考になりました。

どうも有難うございました。

GIMP/Python-Fuのデバッグに関する記事も探したのですが、こちらは本当に情報が少なく苦労しました。そこで、スパース地帯「Python-Fu デバッグ」にて2匹目のどぜうを狙って、大風呂敷を広げた次第です。タイトルは「5分で始めるGimp Pytho-Fu」への敬意×「どぜう」でこのようになりました。ご了承ください。Googleクローラ&中のパンダ・ペンギンたちを欺きスモールキーワードでTop10を狙うのが趣味なのです。(たまに成功します)

TIPS形式なので、脈絡はありません。役に立ちそうなところがあれば拾い読んでください。なお、Windowsでやったので、Windowsでしか有効でないTIPSもあると思います。LinuxやMacにも応用の効くものもあると思います。

どこかで見たよやうな情報も、ここにしかない情報もきっとあります!

TIPS 接触編

🛡 一つ、GIMPの起動はコンソール表示とすべし

    gimp.message("pix2pix_preprocess start")

などのように、messageメソッドで処理の実行経過の表示(表示としては警告扱い)をさせることができます。対話形式になる場合は確認を押さないといけないため厄介です。

f:id:AssistantOfKoo:20210526200738p:plain

メッセージが多すぎると、捨てられます。(Windwosでは標準出力はどこへも接続されていない模様です。「プラグイン内」ではsys パッケージなどで、ファイルに接続をかえて確認することはできると思います。起動時には指定できず無理だと思います。windows版はことあたりがよく考えられていない感じです)


そんな時は起動オプションで

--console-messages

をつければOKです。

f:id:AssistantOfKoo:20210526201752p:plain

内部の情報を表示したいといは

--verbose

 をつければ、さらに起動時、終了時の内部動作をレポートしてくれます。(有用な情報もあります)

f:id:AssistantOfKoo:20210526202324p:plain

わたくしは、この2つをGIMPの起動ショートカットにつけています。

🛡 一つ、プラグイン開発用のフォルダを準備すべし 

 既存のプラグインフォルダで開発するのではなく、すぐに気軽に内容を変更できる開発用のフォルダを準備したほうがやりやすいです。

プラグインフォルダの追加指定を行います。

/編集/設定/左側下部のフォルダ展開[+]/プラグイン/入力欄:開発用のフォルダを入力/ [+]add a new folder/[^]Move the selected folder up/で開発用フォルダを検索の先頭にポジション

f:id:AssistantOfKoo:20210526204932p:plain

設定したら必ず[OK]で確定する

このフォルダの中にプラグインPythonファイルを作成してみます。ただしこれは必須ではありません。格納したプログラム(プラグイン)は次にGIMPが起動するときに読み込まれます。Script-Fuのように、「スクリプトを再読み込み」はありません。

🛡 一つ、起動時のエラーメッセージを注視せよ 

Python-FuのモジュールはGIMPの初期起動時に読み込まれます。 厄介なのが、作成したプラグインモジュールにエラーがあると、所定のメニュー位置に表示されません。しかもどんなエラーが発生したか、全くレポートされません!これは不便です。

まずは、作成/修正したプラグインがちゃんと読み込まれたのかを確認します。

エラーがあれば、コンソールには

f:id:AssistantOfKoo:20210526203011p:plain

と虚しく1行エラーがでるだけです。(なにが悪いかさっぱりわからず)でもまずは「該当プログラムにエラーがあること」を検出することは重要です。

🛡 一つ、エラー検出/文法チェックはIDEの助けを求めよ 

 では、どこがどう悪いかを調べます。このあたりは少ないながらもいろいろな情報がありましたが、次のやり方がいちばんいいと思います。

pyCharmでの手順を説明します。(他のIDEでも基本的に同じです)

(1) 確認用のプロジェクトを作成し、pyCharmで作成したPython-Fuのプラグインを開きます。(環境が整ってないので、エラー表示が多いはずです。)

(2)pyCharmでGIMP内包のpython, 導入済モジュールでLint(文法チェック)環境を作成します。下の例ではダミー用プロジェクトを作成します。

f:id:AssistantOfKoo:20210526203816p:plain

※開発プラグイン用フォルダで直接開発すると、余分なファイルによりGIMPが混乱するので、 開発プラグインフォルダには「完成pythonコード」のみ入れます。開発(ソース編集)自体は別フォルダで行います。(好みによります)

f:id:AssistantOfKoo:20210526205624p:plain

pythonのInterpreter Settingsを確認すると、この環境へ導入済のPackageの一覧とバージョンが確認できます。これは便利だと思います。

※ここから直接pipしても既存環境との優先度合によりこの環境に入るとは限りません。(だいたいうまくいかないと思います。これについては前頁記事を参照ください。)

(3)プロジェクトのフォルダに確認したいpythonソースを複写します。

これで文法誤りの確認はできるようになりましたが、GIMPモジュールが認識できていないため、既にエラー表示が多数あり、わかりにくい状況です。(例ではgimpfu とその関連内容がすべてエラー表示されています。)

f:id:AssistantOfKoo:20210526205941p:plain

(4)GIMPモジュールを認識させます。(ただし実行はできません)

これは海外の情報を含めてHITしなかった情報です。(どこかにあるとは思うけど)

デバッグ(文法チェック)したい人には有用な情報だと思います。

PYTHONPATH環境変数の先頭にC:\Program Files\GIMP 2\lib\gimp\2.0\pythonを入れます。このフォルダがGIMPのgimpfuの格納場所です!

f:id:np2LKoo:20210526211945p:plain

(5)「念のため」再起動します。(再起動しないと反映がうまくいかない経験多数)

(6)GIMPのgimpfuを認識してエラーが全くなくなりました。これで文法エラーがわかりやすくなります。

f:id:np2LKoo:20210526212857p:plain

🛡 一つ、エラーチェックで問題なくとも、IDEでの直実行は叶わずと心得よ

 上記までで文法チェックの課題は解消されたと思いますが、誘惑にかられて直に実行するともちろん怒られます。

f:id:np2LKoo:20210526213117p:plain

🛡 一つ、導入済プラグインとそのバージョンはコマンドかIDEで確認すべし

 IDEで確認する方法は前出のとおりですが、Python-Fuのコンソールからもpython対話と同じように確認できます。通常はpipでやるところですが、exe版のpipはGIMP内包にないので、pythonで実行します。

f:id:np2LKoo:20210526214228p:plain

このGIMP内部環境での状態が知りたいので、外側からコマンドを発行するより確実な情報です。

なお、os.systemは「cmd」に処理がゆだねられ、終ると終了して結果が見えないので、 & pause で終了時に一時停止しています。(WindowsのMS DOSコマンド)

別窓が開き、内容が表示されます。

f:id:np2LKoo:20210526214535p:plain

何かキーを押すとcmdが終了し、制御がPython-Fuコンソールに戻ります。

TISP 発動編

🛡 一つ、不慣れなメソッド動作は1文実行で確認すべし

 さて、エラー系の課題の大物「どこがどう悪いかさっぱりわからない」はこれで解消されたと思います。次に、どうやって組むのか?の話題です。

GIMPに慣れていない方は操作の体系がわかりませんし、慣れた方でも画面操作とプログラム実行が「どこまで同じ」で「どこが異なる」のか非常にわかりにくいように思います。そのときには「1文を実行してみる」のが最良です。

f:id:np2LKoo:20210526220446p:plain

1文づつ実行してみることにより、実際にGIMPの実情報がどうなるかがが画面でいろいろ確認できます。

ただし、画面への表示はdb.gimp_display_new (など)の特定メソッドを実行したときのみ画面とつながります。(これがなければ、画面へは全く表示されません)画面と一度つながれば、1文ごとの操作で、画像、レイヤがどのようになっていくのか(フローティングなのか固定状態なのかetc)を実際に確認しながらコマンド、パラメータを決定していけます。

🛡 一つ、試行・動作確認はUndo有効で行うべし

 上記のプログラムでの実行は基本的に後戻りが必要ないのでUNDOが無効になっています。上記のコマンド実行をして、ctrl+zとしてもUNDOしてくれません。

パラメータやコマンドを試行錯誤したい場合などはこれは不便です。

 image.undo_group_start() としておけばOKです。(imageは操作中イメージオブジェクトです)本来はimage.undo_group_end()とのペアで使用します。

 試行錯誤には必須です!image.undo_group_start() は試行のときのみ使用し、(特に必要な要件がなければ)最終的なプログラム内では使用しないことをお勧めします。UNDO可能は基本的に処理コストがかかります。

🛡 一つ、環境確認は import os / os.system() で行うべし

 GIMPの外で実行するpythonの挙動と内部でのpython挙動は異なります。GIMPが外部からの環境変数による制御を拒否し、内部での定まった環境のみで動作するようにしています。これは安定動作させるためには必須だったと思われます。

GIMP内部でどのような環境で動作しているかは、内部での環境変数から覗うことができます。

osパッケージの応用で、(内部の)環境変数をレポートさせるとpython動作解析のヒントになることがあります。

os.system('set & pause')

f:id:np2LKoo:20210526223118p:plain

🛡 一つ、環境破壊の覚悟あらばpipも叶うであろう

 これは前頁で試行したとおりです。環境変数を操作するのではなく、それにあわせてインストールパッケージを所定の場所に複写する方法です。

import yaml は成功しましたが、import numpy は失敗でした。(numpyは詰めれば実現できそうな気もします。numpyが使用できれば応用範囲は飛躍的に大きくなると思いますが、現時点でわたくし自身の必要性がないのでパスします。:負け惜しみ)

とりあえず追加でopenCVがはいるかやってみます。(宿題1)

(追記)先生!宿題できませんでした。

廊下にたってなさい!

は~い、ごめんなさ~い。openCVはまるまるnumpy依存でした。。。

f:id:np2LKoo:20210527183322j:plain

🛡 一つ、内部環境構成自体を変えるべからず。基本に沿って拡張すべし

 かなり試行しましたが、GIMP内部で動作するpythonの(参照する)環境変数を変更することはできませんでした。もし変えられたとしても変えるといろいろ不都合が起こると思われます。(Linuxとかだとos.systemからexport指定できるので、PYTHONPATHの動的変更もできるかもしれないと思います。思うだけで、試してません。)

現在の環境変数に沿った環境の拡張や整備がよいやり方だと思います。

TIPS 最終回:コスモスに君と

🛡 一つ、コンソールからのLint(文法チェック)操作は「宇宙の終焉と始動」と心得よ

 文法チェックはIDEでのやり方を見つけるまでは、クラッシュ覚悟でGIMP内部Pythonにチェックさせていました。エラーがあるときはクラッシュしませんが、エラーがない状態のソースを確認したとたんGIMPは異常になり、再起動が必要になります。

そもそもここからプラグインを起動するのはNGです。

ですが、Python-Fuコンソールで

execfile('C:\install\pyFu-scripts\pyFu-pix2pix-preprocess.py')

などとすれば、文法チェックをします。その後実行もします。

f:id:np2LKoo:20210526225137p:plain

文法チェックでエラーがあればエラーをレポートしてくれて止まります。エラーがなく、本当にここで実行してしまうと、GIMPが不安定状態になってしまいます。

f:id:np2LKoo:20210526225307p:plain

通常はIDEでの文法チェックをお勧めしますが、IDEレベルでチェックOKで実環境レベルでNGなことは普通にありえます。そんなときには有用です。

 

🛡 一つ、猛者はステップ実行へ挑戦されたし

 表題で期待させておいて申し訳ないのですが、実はこれ(ステップ実行)はやってません。(追記:やりましたが、敗北でした。潔さも時には必要です)

ステップ実行、都度変数内容確認が「できるであろう」ことは海外のサイトの情報で確認しています。おそらくブレークポイントもできる「はず」です。

pythonのリモートデバッグの機能を使い、特定ポートで通信しながら、IDEにマッピングした同一ソースで、ステップ実行/変数の内容確認などを行うものです。

「変数の内容などはgimp.messageで確認すればいいや」程度の規模しか作成していませんが、少し大きな独自フィルタ/大規模ルーティン処理などを作成したい場合はやりたい方もおられると思います。

「毒をくらわば机まで@誰の言葉か忘れました」のとおり、ここ(困難そうなステップ実行デバッグ)は興味があるのでやってみたいと思います。(宿題2)

(追記)pyCharmでやろうと思ってましたが、リモートデバッグはProffesional版でないとできないようです。

winpdbでデバッグできそうな記事はありましたが、このページではVS Code*1でできるか確認しています。今のところ、それっぽい操作をしても「止まりません!」

ローカルプロセスを「アタッチ」してデバッグする方式でやっていますが、デバッガのset_trace() 部分でGIMP側ではデバッガのエラーとなり、VSCode側では該当プロセスへのアタッチがタイムアウトエラーになってしまいます。

f:id:np2LKoo:20210527215516p:plain

※エラーになって残念ですがGIMPでの実行時には、ちゃんと例外を拾ってくれてレポートしてくれるようです!

f:id:np2LKoo:20210527212813p:plain

f:id:np2LKoo:20181203024725p:plain 

止まりません。

できなかったので、宇宙の果てまで逃亡します。

f:id:np2LKoo:20210526230621j:plain スペース ラナウェイ

逃げるは恥がだ役に立つ!

今まで永い間御愛読どうも有難うございました。

やり方をご存知の方は、是非どこかで公表をお願い致します。 

f:id:np2LKoo:20210528182840j:plain

(編集部より)目標は第2宇宙速度を突破し、地球圏から離脱しました。

いままでどうも有難うございました。

In other words ... GIMP3はやくでないかな

GIMP3は もちろんpython3となるようですが、プラグインの構成がまったくかわるそうです。python 2 だと小学生にわらわれるので。。。

f:id:np2LKoo:20210527010537j:plain  f:id:np2LKoo:20210527011219p:plain

 

 

*1:ところで、おしごと系でVisualStudio20xx系やEclipse系、趣味系でpyCharm系を使っていて、VS Codeはあまり使っていないのですが、改めて「VS Code」超絶すごいです。