【问题标题】:How to build and execute a cpp file with embedded python interpreter(pybind11)如何使用嵌入式 python 解释器(pybind11)构建和执行 cpp 文件
【发布时间】:2020-04-22 14:17:49
【问题描述】:

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

来自this tutorial,它使用 CMake,但我正在寻找一种不使用 CMake 的方法。

这是我尝试过的。

example.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
}

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

c++ -O3 -Wall -std=c++11 -undefined dynamic_lookup `python3 -m pybind11 --includes` example.cpp -o example

然后运行二进制文件

./example

我收到以下错误:

dyld:找不到符号:_PyBaseObject_Type 引用自: /Users/cuinjune/Desktop/pybindtest/./example 预期在:flat /Users/cuinjune/Desktop/pybindtest/./example zsh: abort 中的命名空间 ./例子

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

【问题讨论】:

    标签: python c++ pybind11


    【解决方案1】:

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

    假设是标准安装,那只不过是添加:

    `-lpython`
    

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

    `python3-config --libs`
    

    如果你的 python3 安装了python3-config

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

    `python3-config --ldflags`
    

    我仍然假设python3-config 与您的python3 匹配。如果没有,那么另一种方法是获取目录 distutils。在前面加上 -L 并添加 -lpython-lpython3,具体取决于您的安装:

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

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

    【讨论】:

    • 我尝试了以下方法:c++ -O3 -Wall -std=c++11 -undefined dynamic_lookup python3-config --libs -lpython python3 -m pybind11 --includes example.cpp -o example 但是我收到ld: library not found for -lpython3.7m 错误。我也试过-lpython3.7m,但同样的错误。
    • 当我尝试 c++ -O3 -Wall -std=c++11 -undefined dynamic_lookup -lpython python3 -m pybind11 --includes example.cpp -o example 时,它构建得很好,但是当我运行二进制文件,上面写着dyld: Symbol not found: _PyInstanceMethod_Type
    • 我更新了答案。前者是要走的路;后者最有可能选择一个 python2 库(b/c PyInstanceMethod_Type 存在于 3 中,而不存在于 2 中)。
    • c++ -O3 -Wall -std=c++11 -undefined dynamic_lookup python3-config --ldflags python3 -m pybind11 --includes example.cpp -o example 有效。非常感谢!
    • 我不熟悉 Xcode,如果它像其他 IDE 一样直接支持 Python,我不会感到惊讶。但是在编辑链接器标志时,您可能必须直接输入完整的标志(python3-config 是一个程序,所以除非 Xcode 在 shell 上编译,否则它不会运行)。通过在 shell 上运行 python3-config --ldflags 来获取标志,然后将结果复制到 Other Linker Flags。由于您没有分发 Xcode 构建环境,因此硬连接输出不应该是一个实际问题。
    猜你喜欢
    • 1970-01-01
    • 2020-08-28
    • 2019-02-27
    • 1970-01-01
    • 2021-03-28
    • 2021-09-18
    • 1970-01-01
    • 1970-01-01
    • 2010-11-04
    相关资源
    最近更新 更多