Пример pybind11 cmake не может найти основную функцию - PullRequest
0 голосов
/ 24 ноября 2018

I git clone d cmake pybind11 exmaple .Затем я построил его с 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 (последний вызов был последним): File "example.py ", строка 2, в cmake_example.main () AttributeError: модуль 'cmake_example' не имеет атрибута 'main'

Что я делаю не так?

1 Ответ

0 голосов
/ 28 ноября 2018

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

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

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

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

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

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

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