2018年12月6日木曜日

GIMP Script-Py (3) Python-Fu のモジュール化 for Windows

Windows 上の GIMP で、複数の Python 用ファイルに協調させる!。
はい。  Module の Import ですが、実は、これが 難物 です。
少なく共、現行の GIMP 2.10.8 for Windows では、簡単には行きません。
おまじない が必要です。


先ずは、 GIMP for Windows の Python Console での動きを見て下さい。  参考です。

>>> import sys
>>> print sys.path
['', 'C:\\Program Files\\GIMP 2\\32\\lib\\gimp\\2.0\\python', 'C:\\Program Files\\GIMP 2\\lib\\gimp\\2.0\\plug-ins\\python-console', 'C:\\Program Files\\GIMP 2\\32\\lib\\python27.zip', 'C:\\Program Files\\GIMP 2\\32\\lib\\python2.7', 'C:\\Program Files\\GIMP 2\\32\\lib\\python2.7\\plat-win32', 'C:\\Program Files\\GIMP 2\\32\\lib\\python2.7\\lib-tk', 'C:\\Program Files\\GIMP 2\\32\\lib\\python2.7\\lib-old', 'C:\\Program Files\\GIMP 2\\32\\lib\\python2.7\\lib-dynload', 'C:\\building\\msys64\\mingw32', 'C:\\Program Files\\GIMP 2\\32\\lib\\python2.7\\site-packages', 'C:\\Program Files\\GIMP 2\\32\\lib\\python2.7\\site-packages\\gtk-2.0']

>>> import os
>>> print os.getlogin()
UserA

Python で Module(ライブラリ)を呼び出すのは import file-name ですが、
Linux と異なり、Windows では、User 用の plug-in フォルダはサーチ対象から除外されています。  上記参照。

尚、以下の文章で、UserA 等の個々の環境に左右される 単語 ファイル名 関数名 等 は、各々、読み替えて下さいね。.

従って、ライブラリを其処に置き、正常動作させるには、以下のおまじないが必要です。

user_python_dir = 'C:\\Users\\UserA\\AppData\\Roaming\\GIMP\\2.10\\plug-ins'
sys.path.append(user_python_dir)

  でも、毎回実行する度に追加では拙いので、

  origin_path = sys.path
  user_python_dir = 'C:\\Users\\UserA\\AppData\\Roaming\\GIMP\\2.10\\plug-ins'
  if not user_python_dir in sys.path:
     sys.path.append(user_python_dir)

  いいえ、これは無用!
  Console で実験して見れば、分かります。
  現 Version の GIMP (2.10.8) for Windows では、
  Close して 再度開けば、 sys.path は 元のまま(追加前)ですから。

  つまり、 毎回、加えてあげる必要があります。

  但し、クロスプラットフォームを考慮すれば、きっと、また、別の問題が ... 。.

然る後に、
import plug-in-script-file-name

でも、慌てて、その中の関数 def_common1 を実行すると未定義!と怒られます。
はい。  お分かりですね。
def_common1 のまま実行するのではなく、
plug-in-script-file-name.def_common1 として所在を明らかにする必要があります。
pdb.xxxxx の pdb. と同じですね。.

     あっちッ。   関数名  def_common1 は拙かったでしょうか?。
     GIMP の 暗黙の了解 では 関数名は python-fu- で書き出す 慣わし の様ですから。
     勿論、一般的に、組み込み関数名との衝突には十分に配慮する必要があります。
     でも、これは、登録する関数のみ とも考える事も出来ますが、 ね。
     と言う訳で、掟破り の 関数名  def_common1 で説明しました.


はい。  これで、無事、解決。
と思いきや、 検討課題はあります。


user_python_dir = 'C:\\Users\\UserA\\AppData\\Roaming\\GIMP\\2.10\\plug-ins'

は、 自分のユーザー環境文字列をハードコーディングしています。

UserA を置き換えるなら、
OS Windows 限定なら、import os の後、 os.environ.get("USERNAME") 。
無難そうなのは os.path.expanduser('~') 。

  user_python_dir = os.path.expanduser('~') で 'C:\\Users\\UserA' が返ります。
  環境依存なので、 'C:' だったり 'D:' だったり 'E:' だったり しますが ... 。

一番の難点は、
GIMP 2.10.x 限定と言う事!。
GIMP 2.8 は全くの別フォルダですし、 将来の GIMP 3.x の構成がどうなるかは不明ですから。

これでは、GIMP の Version Check ロジックが必要になりそうです。

GIMP GUI の Setting Dialog にある スクリプト環境のリストを取得出来れば良さそうなのですが ... 。
勿論、Windows での GIMP が 適切な処理 をする様に更新されて、この問題が解決される事も考えられます ... 。


最後に。
個人的な興味から、試した内容ですが、
実際、モジュール化の出番がどの位あるのか?は疑問です。

確かに、ソースを一元管理出来ますから、メンテは楽です。
それ程 多くない スクリプト群の為に、共通部分を切り出し、モジュール化するのと、
面倒でも、いちいち、各ファイルに関数定義を重複して持たせるのと、
どちらを選ぶか、ですね。

悩ましいと言えば、悩ましい、... です。
仮に、ファイルの公開配布を念頭に置くとすると、余計、悩んでしまいます。
OS 固有の問題絡みでもある事ですし ... 。  .



0 件のコメント:

コメントを投稿