boost/python/exec.hpp

はじめに

Python のインタープリタを C++ コードへ組み込む機構をエクスポートする。

関数

eval

object eval(str expression, object globals = object(), object locals = object())
効果

辞書 globals および locals が指定した文脈で Python の式 expression を評価する。

戻り値

式の値を保持する object のインスタンス。

exec

object exec(str code, object globals = object(), object locals = object())
効果

辞書 globals および locals が指定した文脈で Python のソースコード code を実行する。

戻り値

コードの実行結果を保持する object のインスタンス。

exec_file

object exec_file(str filename, object globals = object(), object locals = object())
効果

辞書 globals および locals が指定した文脈で、filename で与えた名前のファイルから Python のソースコードを実行する。

戻り値

コードの実行結果を保持する object のインスタンス。

以下の例は、importexec を使用して Python で関数を定義し、後で C++ から呼び出している。

#include <iostream>
#include <string>

using namespace boost::python;

void greet()
{
  // main モジュールを得る。
  object main = import("__main__");

 // main モジュールの名前空間を得る。
 object global(main.attr("__dict__"));

 // Python 内で greet 関数を定義する。
 object result = exec(
    "def greet():                   \n"
    "   return 'Hello from Python!' \n",
    global, global);

  // greet 関数への参照を作成する。
  object greet = global["greet"];

  // 呼び出す。
  std::string message = extract<std::string>(greet());
  std::cout << message << std::endl;
}

文字列に Python のスクリプトを組み込む代わりに、ファイルに格納しておいてもよい。

def greet():
   return 'Hello from Python!'

代わりにこれを実行する。

// ...
  // ファイルから greet 関数を読み込む。
  object result = exec_file(script, global, global);
  // ...
}