こちらの続きです。
スクリプトから別のスクリプトを呼び出したい - C#ATIA
前回あれはあれで良いのですが、やりたい事とは違う事に気が付きました。
他のスクリプトを動的に取得して実行したいんです。
(どちらかと言うと、前回のは静的に実行なんです)
"他のスクリプトを動的に取得して実行" となると、importが問題なんです。
最近javascriptの本を読んだ際、(相変わらずお勉強中)
”importは書かれた位置に関わらず、どの処理より優先して実行される”
”その為、string型の変数でimportする事は出来ない”
"何故なら、優先して実行される為、変数が定義されていない為だ!"
の様な記載がされていました。
ちょっと・・・やろうとしている事全否定じゃないのか。
importが優先して実行されるのは、恐らくどの言語でも同様だろう
とは感じますが、まぁjavascriptの話だしpythonなら何か逃げ道が
あるんじゃないのかな? と思い探した所、直ぐに見つかりました。
[Python] 文字列で指定したモジュールを、動的にインポートを行う - YoheiM .NET
動的にインポートは "Dynamic Import" と言うんですね。
文字列でインポートが出来ちゃいます。えらいpython。
目的の処理を行う為に書き換えてみました。
# Fusion360API Python script import adsk.core import adsk.fusion import traceback import sys import pathlib from importlib import import_module def run(context): ui = None try: app = adsk.core.Application.get() ui = app.userInterface # スクリプトのフォルダーパス parent_dir = pathlib.Path(__file__).resolve().parent.parent target_dir = parent_dir / 'NewScript1' # モジュール取得 NewScript1 = getModule(target_dir) # 外部スプリクト実行 NewScript1.run(context) except: if ui: ui.messageBox('Failed:\n{}'.format(traceback.format_exc())) def getModule(path): try: stem = path.stem sys.path.append(str(path)) module = import_module(stem) except: module = None finally: del sys.path[-1] return module
やっぱりsys.pathは必要っぽいです。
"import_module" が優先的に実行されるかどうかは確認していないのですが、
恐らく優先的では無いのでは?と思ってます。