2014-11-20 62 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在他的回答中所述。