pybind11 cmake示例找不到主要功能

时间:2018-11-24 16:52:45

标签: python c++ cmake pybind11 language-binding

git clone d pybind11's cmake exmaple。然后,我用pip install ./cmake_example构建了它。我的python文件包含以下内容:

import cmake_example
print(cmake_example.add(1, 2))

这很好。现在,我想使用pybind11的解释器。我根据docs中的说明更改了CMakeLists.txt。以下是我现在拥有的:

main.cpp

#include <pybind11/embed.h>

namespace py = pybind11;

int main()
{
    py::scoped_interpreter guard{};

    py::print("Hello world");
}

PYBIND11_MODULE(cmake_example, m)
{
    m.def("main", &main);
}

CMakeLists.txt

cmake_minimum_required(VERSION 2.8.12)
project(cmake_example)

add_subdirectory(pybind11)
add_executable(cmake_example src/main.cpp)
target_link_libraries(cmake_example PRIVATE pybind11::embed)

example.py

import cmake_example
cmake_example.main()

运行上面的python文件时,出现以下错误:

  

回溯(最近通话最近):   在第2行的文件“ example.py”中   cmake_example.main()   AttributeError:模块'cmake_example'没有属性'main'

我在做什么错了?

1 个答案:

答案 0 :(得分:0)

我认为您正在混合两种不同的方法。

嵌入特别是指将python解释器嵌入到现有的可执行文件中。您所引用的文档使它(或尝试使其)很清晰。

这意味着您应该具有一个C / C ++可执行文件,可以从中执行python代码(在文件内部或作为字符串)。

现在,这已经不成问题了,请查看构建目录内部,您将找到一个cmake_example二进制文件。运行它,您将看到打印结果。您不能直接从标准python解释器中导入此内置模块,而是可以在自定义可执行文件(在这种情况下为cmake_example)调用的文件中找到该模块。

您还可以通过更改以下代码来运行example.py:

int main()
{
    py::scoped_interpreter guard{};

    py::eval_file("example.py");
}