Skip to content

[Pythonマクロ] トップレベルでimportしたモジュールや定義した変数を関数内から参照できない #2608

Description

@fumokmm

問題内容

Pythonマクロ内でトップレベルに import したモジュールや定義した変数を、同じスクリプト内で定義した関数から参照できません。

通常のPythonスクリプトとは異なる名前空間の動作になっているようです。

例えば、以下は正常に動作します。

import SakuraEditor

SakuraEditor.InsText("ABC")

一方、同じ処理を関数にすると、

import SakuraEditor

def test():
    SakuraEditor.InsText("ABC")

test()

以下のエラーになります。

name 'SakuraEditor' is not defined

トップレベルで定義した変数についても同様です。

また、マクロ内で以下を実行して locals() の内容を globals() にコピーすると正常に動作しました。

globals().update(locals())

ソースコードを確認したところ、CPythonMacroManager.cpp では以下のように globalslocals に別々の辞書を渡しているように見えました。

PyObject* pGlobals = PyModule_GetDict(pMain);

PyObjectPtr pLocals = PyDict_New();

PyEval_EvalCode(pCode, pGlobals, pLocals);

トップレベルの import や代入が pLocals に格納される一方、そこで定義した関数のグローバル名前空間は pGlobals となるため、関数内からトップレベルの名前を参照できなくなっているのではないかと思います。

通常のPythonスクリプトと同じ名前解決になるのが期待する動作ではないかと思います。

再現手順

  1. Pythonマクロを実行できる状態にする
  2. 以下のPythonマクロを登録する
import SakuraEditor

def test():
    SakuraEditor.InsText("ABC")

test()
  1. マクロを実行する
  2. 以下のエラーが表示される
name 'SakuraEditor' is not defined

以下のように直接呼び出した場合は正常に動作します。

import SakuraEditor

SakuraEditor.InsText("ABC")

また、以下のように globals().update(locals()) を追加すると正常に動作します。

import SakuraEditor

def test():
    SakuraEditor.InsText("ABC")

globals().update(locals())

test()

再現頻度

毎回再現します。

問題のカテゴリ

  • プログラムの動作上の問題
    • 正式リリース版

環境情報

スクリーンショット

name 'SakuraEditor' is not defined と表示されるエラーダイアログのスクリーンショットを添付します。
Image

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions