Пример Python — Pybind11 Cmake не может найти основную функцию

я git cloned Cmake Exmaple Pybind11. Затем я построил его с pip install ./cmake_example, Мой файл Python содержит следующее:

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

Это отлично работает. Теперь я хочу использовать pybind11переводчик. Я изменил 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 (последний вызов был последним):
Файл «example.py», строка 2, в
cmake_example.main ()
AttributeError: модуль ‘cmake_example’ не имеет атрибута ‘main’

Что я делаю неправильно?

0

Решение

Я думаю, что вы смешиваете два разных подхода.

Встраивание, в частности, относится к встраиванию интерпретатора Python в существующий исполняемый файл. Документ, на который вы ссылаетесь, чтобы сделать это (или попытаться) вполне понятным.

Это означает, что у вас должен быть исполняемый файл C / C ++, из которого вы можете выполнять код Python (либо внутри файла, либо в виде строки).

Теперь, когда этого нет, загляните в свой встроенный каталог, и вы найдете двоичный файл cmake_example. Запустите его, и вы увидите печать. Вы не можете напрямую импортировать этот встроенный модуль из стандартного интерпретатора Python, скорее он доступен внутри файла, вызываемого из пользовательского исполняемого файла, в данном случае cmake_example.

Вы также можете запустить example.py, изменив код следующим образом:

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

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]