我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'
我在做什么错了?
答案 0 :(得分:0)
我认为您正在混合两种不同的方法。
嵌入特别是指将python解释器嵌入到现有的可执行文件中。您所引用的文档使它(或尝试使其)很清晰。
这意味着您应该具有一个C / C ++可执行文件,可以从中执行python代码(在文件内部或作为字符串)。
现在,这已经不成问题了,请查看构建目录内部,您将找到一个cmake_example二进制文件。运行它,您将看到打印结果。您不能直接从标准python解释器中导入此内置模块,而是可以在自定义可执行文件(在这种情况下为cmake_example)调用的文件中找到该模块。
您还可以通过更改以下代码来运行example.py:
int main()
{
py::scoped_interpreter guard{};
py::eval_file("example.py");
}