1

C++ プロジェクトに Python を埋め込むために BoostPython を使用していますが、Python に関するすべてのこと、特に名前空間システムを理解していません。

実際、私はこのコードを使用しました:

byte_code = Py_CompileString(filedata, filename, Py_file_input);

// [...]

PyObject* res = NULL;

PyObject* main_module = PyImport_AddModule("__main__");
PyObject* global_dict = PyModule_GetDict(main_module);
PyObject* local_dict = PyDict_New();
py::object local_namespace(py::handle<>(py::borrowed(local_dict)));

// Set a user object (only for this execution)
local_namespace["user_object"] = py::ptr(&MyObject);

res = PyEval_EvalCode( byte_code, global_dict, local_dict );

Py_XDECREF(res);
Py_XDECREF(local_dict);

しかし、次のようなPythonスクリプトを実行すると:

def testB():
    print("B")

def testA():
    testB() # NameError: global name 'testB' is not defined

testA() # Works
testB() # Works

さて、私は使用することができました

res = PyEval_EvalCode( byte_code, global_dict, global_dict );

それ以外の

res = PyEval_EvalCode( byte_code, global_dict, local_dict );

しかし、新しい関数定義からglobal_dictを保存したい(新しいスクリプトを起動するときに、非常に古い実行からの以前の関数定義を呼び出せないようにするためです!)

名前空間の問題ですね。

4

1 に答える 1

0

はい、これは名前空間の問題です。Python がスコープを処理する方法 (特に "self" キーワード) を調べる必要があります。

つまり、クラス メンバーの変数と関数には "self" というプレフィックスが付きます。それらが現在のオブジェクトのスコープのメンバーであることを指定するため。「Self」は、C++ および C# の「this」キーワードに大まかに似ています。

于 2013-11-04T20:10:48.820 に答える