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を保存したい(新しいスクリプトを起動するときに、非常に古い実行からの以前の関数定義を呼び出せないようにするためです!)
名前空間の問題ですね。