2014-11-20 107 views
6

我正在制作一个Qt Quick GUI应用程序(对于Windows),它使用OpenGL和C++进行一些计算密集型的工作。我想将python代码嵌入到应用程序中,以便在Python中执行一些相对容易的东西。将Python 3.4嵌入到C++ Qt应用程序中?

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

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

#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 \包括\ object.h:435:错误:C2059:语法错误:“; “

C:\ Python34 \ include \ object.h:435:error:C2238:在';'之前的意外标记(s)

C:\用户\阿莫尔\桌面\ TestWidgetApp \ main.cpp中:19:错误:C3861: 'PyString_FromString':标识符找不到

+1

你能展示你试过的代码并解释它为什么不起作用吗? – user3419537 2014-11-20 17:30:00

+1

在我看来,在PyQt + PyOpenGL中构建应用程序要容易得多,并且如果需要的话,可以在C++模块中进行计算。 PyQt和PyOpenGL是C++代码的包装,所以它不会放慢速度。如果你的计算使用了常用的例程(例如线性逼近,矩阵乘法等),也有用C++编写的Python库,你可以跳过整个C++部分。 – Fenikso 2014-11-20 17:39:43

+3

RTFM [在另一个应用程序中嵌入Python](https://docs.python.org/3/extending/embedding.html) – 2014-11-20 18:03:40

回答

0

我已经删除了所有Qt代码从你的榜样,然后我试着编译它(Qt与编译错误无关)。它为我编译。不同之处在于我使用了来自Python 2.7的包含文件。

所以我做了一些搜索文件夹中的字符串PyString_FromStringC:\Python33\includes我注意到您使用Python 3.4和3.3不,但我怀疑这是一个3.x的事情)和C:\Python27\includes

结果:

的Python 3.3

Searching string PyString_FromString in Python33's include folder

的Python 2.7

Searching string PyString_FromString in Python27's include folder

所以,很明显,Python的3.4是不是由您的支持嘘声tPython版本。

0

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

使用PyUnicode_FromStringPyUnicode_FromStringAndSizeUTF-8构建str对象编码C串(char*)。

+0

它仍然给我这两个错误:'C:\ Python34 \ include \ object.h:435:错误:C2059:语法错误:' ;'' 'C:\ Python34 \ include \ object.h:435:error:C2238:在';'之前有意外的标记( – 2014-11-26 04:26:06

+0

)您确定在编译工具集中使用了正确的Python版本吗? 像'bjam target-os = windows/python = 3.4'? 或者至少定义“PY_MAJOR_VERSION = 3”和“PY_MINOR_VERSION = 4”。 – 2014-11-26 13:51:29

2

这里的问题是,Python 3.4有一个名为“slots”的结构成员,(文件对象。h时,中的typedef PyType_Spec),其Qt的从你下定义,以便您能说这样的话:在你的代码

public slots: 

。解决的办法是补充:

#undef slots 

你包括Python.h之前,并重新定义它,你有任何在使用Qt的方式做使用“插槽”前:

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

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

有点(因为你取决于Qt中的slots的特定定义),但它应该让你去。

-1

移动你的

#include "boost/python.hpp" 

...是之前您的其他包括,它会解决您的问题。

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