pybind11 の pybind11::scoped_interpreter を使うと、C++ から Python インタプリタを起動できます。

sample.cpp

#include <pybind11/embed.h>
#include <pybind11/pybind11.h>

namespace py = pybind11;

int main()
{
    py::scoped_interpreter interpreter;
    py::print("Hello, world!");

    return 0;
}

pybind11 を使ったプログラムをコンパイルするには、pybind11 が提供するヘッダファイルの他に Python.h が必要です。 Python.h はリンクする Python のバージョンに合わせる必要があります。

次の例では、Mac にプリインストールされている Python にリンクしています。

$ # M1 Mac (Ventura) + Python 3.9.6 + pybind11 2.10.3 (Homebrew)
$ clang sample.cpp -std=c++20 -lc++ -lpython3.9 -rpath /Library/Developer/CommandLineTools/Library/Frameworks -I/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.9/Headers -I/opt/homebrew/Cellar/pybind11/2.10.3/include -L/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.9/lib -o sample

$ ./sample
Hello, world!

Python.h の場所は OS やインストール方法によって異なります。

また、pybind11 の場所もインストール方法に依存します。 詳細は mac に pybind11 をインストールする を参照してください。

注意点

pybind11 の動作に影響するため、Py_InitializePy_Finalize を直接使うことはできません。 pybind11 が提供する scoped_interpreter を使う必要があります。

Do not use the raw CPython API functions Py_Initialize and Py_Finalize as these do not properly handle the lifetime of pybind11’s internal data.


引用: Embedding the interpreter — pybind11 documentation
https://pybind11.readthedocs.io/en/stable/advanced/embedding.html

参考資料