C#ATIA

↑タイトル詐欺 主にFusion360API 偶にCATIA V5 VBA(絶賛ネタ切れ中)

スクリプトから別のスクリプトを呼び出したい2

こちらの続きです。
スクリプトから別のスクリプトを呼び出したい - 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" が優先的に実行されるかどうかは確認していないのですが、
恐らく優先的では無いのでは?と思ってます。