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_Initialize
と Py_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
参考資料
-
pybind/pybind11: Seamless operability between C++11 and Python
https://github.com/pybind/pybind11 -
Embedding the interpreter — pybind11 documentation
https://pybind11.readthedocs.io/en/stable/advanced/embedding.html -
mac に pybind11 をインストールする
http://yokaze.github.io/2018/02/05/