【问题标题】:Embedding python 3.4 into C++ Qt Application?将 python 3.4 嵌入到 C++ Qt 应用程序中?
【发布时间】:2015-01-18 15:39:15
【问题描述】:

我正在制作一个 Qt Quick GUI 应用程序(用于 Windows),它使用 OpenGL 和 C++ 处理一些计算密集型的东西。我想将python代码嵌入到应用程序中,以做一些在python中相对容易的事情。

基本上,我只是想让 c++ 代码在 python 脚本中调用一个函数并让脚本完成这项工作,然后将返回的数据存储在一个变量(字符串或浮点数等)中以供进一步使用。我正在使用 Qt creator,并且我得到了用于 MinGW 编译器的 python3 库。我尝试了一些代码,但它看起来像 python lib 与 Qt creator 不太兼容。使用 pyqt 是个好主意吗?最好和最简单的方法是什么?

编辑: 这是我尝试的基本代码,首先它给了我一个错误说,找不到 pyconfig.h。然后我在我的 python34 包含目录中添加了一个 INCUDEPATH。

#include "mainwindow.h"
#include <QApplication>
#include <boost/python.hpp>


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    using namespace boost::python;

    PyObject *pName, *pModule, *pDict, *pFunc, *pValue;

        Py_Initialize();

        pName = PyString_FromString(argv[1]);

        pModule = PyImport_Import(pName);


        pDict = PyModule_GetDict(pModule);


        pFunc = PyDict_GetItemString(pDict, argv[2]);

        if (PyCallable_Check(pFunc))
        {
            PyObject_CallObject(pFunc, NULL);
        } else
        {
            PyErr_Print();
        }

        // Clean up
        Py_DECREF(pModule);
        Py_DECREF(pName);

        Py_Finalize();

    return a.exec();
}

我的 .pro 文件:

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = TestWidgetApp
TEMPLATE = app

INCLUDEPATH += C:/boost_1_57_0
INCLUDEPATH += C:/Python34/include

SOURCES += main.cpp\
        mainwindow.cpp

HEADERS  += mainwindow.h

FORMS    += mainwindow.ui

OTHER_FILES +=

然后出现以下错误:

C:\Python34\include\object.h:435:错误:C2059:语法错误:';'

C:\Python34\include\object.h:435: 错误: C2238: ';' 前面的意外标记

C:\Users\Amol\Desktop\TestWidgetApp\main.cpp:19:错误:C3861:'PyString_FromString':找不到标识符

【问题讨论】:

  • 您能否展示您尝试过的代码并解释为什么它不起作用?
  • 在我看来,在 PyQt + PyOpenGL 中构建应用程序并在必要时在 C++ 模块中进行计算会容易得多。 PyQt 和 PyOpenGL 是 C++ 代码的包装器,因此它不会变慢。如果你的计算使用了常用的例程(例如线性逼近、矩阵乘法等),这些例程也有用 C++ 编写的 Python 库,你可以跳过整个 C++ 部分。
  • 好的,我编辑并添加了我尝试过的代码,你们现在可以取消保留吗?另外,我应该将包含乘法函数的 py 文件放在哪里? (代码基于以下文章:goo.gl/gTnu6

标签: python c++ qt opengl pyqt


【解决方案1】:

这里的问题是 Python 3.4 有一个名为“slots”的结构成员(文件 object.h,在 PyType_Spec 的 typedef 中),Qt 从你下面定义出来,这样你就可以说:

public slots:

在您的代码中。解决方法是添加:

#undef slots

就在您包含 Python.h 之前,并在您包含以 Qt 方式使用“插槽”的任何内容之前重新定义它:

#undef slots
#include <Python.h>
#define slots

#include "myinclude.h"
#include <QString>

有点小技巧(因为你依赖于 Qt 中 slots 的特定定义),但它应该能让你继续前进。

【讨论】:

    【解决方案2】:

    我已从您的示例中删除了所有 Qt 代码,然后我尝试编译它(Qt 与您的编译错误无关)。它为我编译。不同之处在于我使用了 Python 2.7 中的包含文件。

    所以我在文件夹中搜索了字符串PyString_FromStringC:\Python33\includes我注意到你使用 python 3.4 而不是 3.3,但我怀疑这是 3.x 的东西)和C:\Python27\includes

    结果:

    Python 3.3

    Python 2.7

    因此,很明显,您的 BoostPython 版本不支持 Python 3.4。

    【讨论】:

      【解决方案3】:

      Python3 没有PyString_FromString 函数。 Python3 str 内部类型是具有复杂结构的 unicode 对象。

      使用PyUnicode_FromStringPyUnicode_FromStringAndSizeUTF-8 编码的C 字符串(char*) 构造str 对象。

      【讨论】:

      • 它仍然给我这两个错误:C:\Python34\include\object.h:435: error: C2059: syntax error : ';'C:\Python34\include\object.h:435: error: C2238: unexpected token(s) preceding ';'
      • 你确定你在编译工具集中使用了正确的python版本吗?喜欢bjam target-os=windows/python=3.4?或者至少定义PY_MAJOR_VERSION=3PY_MINOR_VERSION=4
      【解决方案4】:

      移动你的

      #include "boost/python.hpp" 
      

      ...在您的其他包含之前,它将解决您的问题。

      实际问题正如 Scott Deerwester 在他的回答中所描述的那样。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-30
        • 2016-02-15
        • 2011-11-22
        相关资源
        最近更新 更多