pybind11 cmake 示例找不到主要功能

pybind11 cmake example cannot find the main function

git cloned 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 文件时,出现以下错误:

Traceback (most recent call last): File "example.py", line 2, in cmake_example.main() AttributeError: module 'cmake_example' has no attribute 'main'

我做错了什么?

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

嵌入特指将python解释器嵌入到现有的可执行文件中。您所参考的文档使其(或试图)非常清楚。

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

既然这已经结束,请查看您构建的目录,您会发现一个 cmake_example 二进制文件。 运行 它,您将看到印刷品。您不能直接从标准 python 解释器中导入此内置模块,而是在从自定义可执行文件调用的文件中可用,在本例中为 cmake_example。

您也可以运行 example.py 更改代码如下:

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

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