Boost - импорт созданного Qt модуля C ++ Python в Python - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть следующий код в приложении 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 добавляется в таблицу.Из идей что делать, заглядывали в разные места.Но все же застрял с этой частью проблемы.

1 Ответ

0 голосов
/ 20 февраля 2019

Поскольку модуль hello определен в этой программе Qt, он доступен только в этой программе.Выполнение программы не делает ее доступной для интерпретатора Python, который ожидает найти hello.py или hello.so (расширение файла может варьироваться в зависимости от операционной системы) при импорте привет import hello.

Youнужно построить модуль Python, ответ может помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...