[英]Embedding python 3.4 into C++ Qt Application?
我正在制作一個Qt Quick GUI應用程序(用於Windows),它使用OpenGL和C ++來處理一些計算密集型的東西。 我想在應用程序中嵌入python代碼,以便做一些在python中相對容易的東西。
基本上,我只是希望c ++代碼在python腳本中調用函數並讓腳本完成工作,然后將返回的數據存儲在變量(字符串或浮點數等)中以供進一步使用。 我正在使用Qt創建器,我為MinGW編譯器提供了python3 lib。 我嘗試了一些代碼,但它看起來像python lib與Qt creator不完全兼容。 使用pyqt這是一個好主意嗎? 什么是最好和最簡單的方法呢?
編輯:這是我試過的基本代碼,首先它給了我一個錯誤說,找不到pyconfig.h。 然后我在我的python34 include目錄中添加了一個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();
}
我的簡歷:
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':找不到標識符
這里的問題是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
定義),但它應該讓你前進。
我已從您的示例中刪除了所有Qt代碼,然后我嘗試編譯它(Qt與編譯錯誤無關)。 它為我編譯。 不同之處在於我使用了Python 2.7中的包含文件。
所以,我做的字符串有點搜索PyString_FromString
中的文件夾: C:\\Python33\\includes
( 我注意到您使用Python 3.4和3.3不,但我懷疑這是一個3.X的事情 )和C:\\Python27\\includes
。
結果:
Python 3.3
Python 2.7
所以,顯然,BoostPython版本不支持Python 3.4。
Python3沒有PyString_FromString
功能。 Python3 str
類型內部是具有復雜結構的unicode對象。
使用PyUnicode_FromString
或PyUnicode_FromStringAndSize
從UTF-8
編碼的C
字符串( char*
)構造str
對象。
移動你的
#include "boost/python.hpp"
...在你的其他包括之前,它將解決你的問題。
實際問題是Scott Deerwester在他的回答中所描述的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.