C++ プロジェクトに取り組んでいるときに、自分の本業ではないサード パーティのライブラリを探していました。必要なことを正確に実行する、非常に優れたライブラリを見つけましたが、それは Python で書かれています。Boost.Python ライブラリを使用して、Python コードを C++ に埋め込む実験を行うことにしました。
C++ コードは次のようになります。
#include <string>
#include <iostream>
#include <boost/python.hpp>
using namespace boost::python;
int main(int, char **)
{
Py_Initialize();
try
{
object module((handle<>(borrowed(PyImport_AddModule("__main__")))));
object name_space = module.attr("__dict__");
object ignored = exec("from myModule import MyFunc\n"
"MyFunc(\"some_arg\")\n",
name_space);
std::string res = extract<std::string>(name_space["result"]);
}
catch (error_already_set)
{
PyErr_Print();
}
Py_Finalize();
return 0;
}
Python コードの (非常に) 単純化されたバージョンは次のようになります。
import thirdparty
def MyFunc(some_arg):
result = thirdparty.go()
print result
問題は次のとおりです。「MyFunc」は正常に実行され、「結果」の出力が表示されます。私ができないことは、C++ コードから「結果」を読み取ることです。抽出コマンドは、どの名前空間でも「結果」を見つけることはありません。「結果」をグローバルとして定義しようとしましたが、タプルを返そうとしましたが、動作させることができません。