代码之家  ›  专栏  ›  技术社区  ›  Zack Lee

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

  •  1
  • Zack Lee  · 技术社区  · 5 年前

    我正试图找到一种方法,用pybind11构建并运行一个带有嵌入式python解释器的cpp文件。

    this tutorial ,它使用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
    }
    

    在终端上运行以下命令:(构建良好)

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

    然后用

    ./example
    

    我得到以下错误:

    dyld:找不到符号:_PyBaseObject_引用自的类型: /Users/cuinjune/Desktop/pybindtest//example应输入:flat /Users/cuinjune/Desktop/pybindtest/中的命名空间/example zsh:abort /示例

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

    1 回复  |  直到 5 年前
        1
  •  4
  •   Wim Lavrijsen    5 年前

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

    假设是标准安装,那么只需添加:

    `-lpython`
    

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

    `python3-config --libs`
    

    如果你的蟒蛇有 python3-config 安装。

    编辑 :根据注释,设置中的链接器无法使用相关库目录。一种选择是使用完整的标志集:

    `python3-config --ldflags`
    

    我还在假设 蟒蛇3形态 符合您的 python3 . 如果不是,则另一种方法是获取目录distutils。在前面加上 -L 加上 -lpython -利皮顿3 根据您的安装:

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

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