はい。 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 件のコメント:
コメントを投稿