я git clone
d 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’
Что я делаю неправильно?
Я думаю, что вы смешиваете два разных подхода.
Встраивание, в частности, относится к встраиванию интерпретатора Python в существующий исполняемый файл. Документ, на который вы ссылаетесь, чтобы сделать это (или попытаться) вполне понятным.
Это означает, что у вас должен быть исполняемый файл C / C ++, из которого вы можете выполнять код Python (либо внутри файла, либо в виде строки).
Теперь, когда этого нет, загляните в свой встроенный каталог, и вы найдете двоичный файл cmake_example. Запустите его, и вы увидите печать. Вы не можете напрямую импортировать этот встроенный модуль из стандартного интерпретатора Python, скорее он доступен внутри файла, вызываемого из пользовательского исполняемого файла, в данном случае cmake_example.
Вы также можете запустить example.py, изменив код следующим образом:
int main()
{
py::scoped_interpreter guard{};
py::eval_file("example.py");
}
Других решений пока нет …