如何使用嵌入式 python 解释器构建和执行 cpp 文件(pybind11)

Zac*_*Lee 4 c++ python pybind11

我正在尝试找到一种使用 pybind11 构建和运行带有嵌入式 python 解释器的 cpp 文件的方法。

本教程中,它使用 CMake,但我正在寻找一种无需 CMake 即可完成此操作的方法。

这是我尝试过的。

示例.cpp中:

#include <pybind11/embed.h> // everything needed for embedding
namespace py = pybind11;

int main() {
    py::scoped_interpreter guard{}; // start the interpreter and keep it alive

    py::print("Hello, World!"); // use the Python API
}
Run Code Online (Sandbox Code Playgroud)

当我运行以下命令时,在终端中:(构建良好)

c++ -O3 -Wall -std=c++11 -undefined dynamic_lookup `python3 -m pybind11 --includes` example.cpp -o example
Run Code Online (Sandbox Code Playgroud)

然后运行二进制文件

./example
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

dyld:未找到符号:_PyBaseObject_Type 引用自:/Users/cuinjune/Desktop/pybindtest/./example 预期位置:/Users/cuinjune/Desktop/pybindtest/./example 中的平面命名空间 zsh:中止 ./example

有没有可能的方法可以使用 pybind11 正确构建和执行带有嵌入式 python 解释器的 cpp 文件?(不使用 CMake)

Wim*_*sen 5

与 python 库链接,该库定义了该符号(以及您需要的更多符号)。

假设采用标准安装,则只需添加:

`-lpython`
Run Code Online (Sandbox Code Playgroud)

到 CLI(或者-lpython3等等,如果您的系统上存在多个 python 库)。您也可以添加:

`python3-config --libs`
Run Code Online (Sandbox Code Playgroud)

如果你的python3已经python3-config安装了。

编辑:根据评论,相关的库目录不可用于您设置中的链接器。一种选择是使用完整的标志集:

`python3-config --ldflags`
Run Code Online (Sandbox Code Playgroud)

我仍然假设python3-config与你的python3. 如果没有,则另一种方法是获取目录 distutils。根据您的安装添加或-L添加前缀:-lpython-lpython3

-L`python3 -c 'import distutils.sysconfig as ds; print(ds.get_config_var("LIBDIR"))'` -lpython
Run Code Online (Sandbox Code Playgroud)

(是的,还有一个“LDFLAGS”config_var,但这些是用于构建 python 的标志,不太可能是您想要的。)