У меня есть следующий код в приложении Qt Quick вместе с Boost.В этом Cpp есть персональный модуль, созданный с использованием BOOST_PYTHON_MODULE(hello)
.Основная цель - уметь import hello
в Python и вызывать методы hello struct.Мой скрипт на Python содержит только очень простую структуру, так как я просто не хочу видеть ошибок при импорте hello.
import hello
print("Import was successful!")
Большинство приведенных ниже кодов скопированы из другого вопроса в stackoverflow, но не полностью, поэтому мне пришлось перепоститьчасти.
Main.cpp
#include <cstdlib> // setenv, atoi
#include <iostream> // cerr, cout, endl
#include <boost/python.hpp>
#include <QGuiApplication>
#include <QQmlApplicationEngine>
struct World
{
void set(std::string msg) { this->msg = msg; }
std::string greet() { return msg; }
std::string msg;
};
//---------------------------------------------------------------------------------------------------------------------
/// Staticly linking a Python extension for embedded Python.
BOOST_PYTHON_MODULE(hello)
{
namespace python = boost::python;
python::class_<World>("World")
.def("greet", &World::greet)
.def("set", &World::set)
;
}
//---------------------------------------------------------------------------------------------------------------------
int main(int argc, char *argv[])
{
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QGuiApplication app(argc, argv);
namespace python = boost::python;
try
{
int uploaded = PyImport_AppendInittab("hello", &PyInit_hello);
//This executes else part
if(uploaded == -1)
std::cout<< "Module table was not extended: " << uploaded << std::endl;
else
std::cout<< "Module Table was extended" << std::endl;
Py_Initialize();
} catch (...)
{
PyErr_Print();
return 1;
}
return app.exec();
}
Наконец, я запускаю свое приложение QT, и return app.exec();
поддерживает его работу, пока я пытаюсь запустить свой скрипт на pythonкак уже упоминалось выше из терминала.Сценарий python находится в том же каталоге, что и запущенное в данный момент приложение, но не уверен, что это что-то меняет.
Тогда я получаю ошибку:
Traceback (most recent call last):
File "test_hilton.py", line 1, in <module>
import hello
ModuleNotFoundError: No module named 'hello'
Не уверен, что мне не хватаетВот.В соответствии с API-интерфейсом Python:
PyImport_AppendInittab - добавление одного модуля к существующей таблице встроенных модулей.Это удобная оболочка для PyImport_ExtendInittab (), возвращающая -1, если таблица не может быть расширена.Новый модуль может быть импортирован по имени и использует функцию initfunc в качестве функции инициализации, вызываемой при первой попытке импорта.
И часть If-else внутри блока try-catch внутриmain доказывает, что модуль hello добавляется в таблицу.Из идей что делать, заглядывали в разные места.Но все же застрял с этой частью проблемы.