簡體   English   中英

將python 3.4嵌入到C ++ Qt應用程序中?

[英]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

在Python33的include文件夾中搜索字符串PyString_FromString

Python 2.7

在Python27的include文件夾中搜索字符串PyString_FromString

所以,顯然,BoostPython版本不支持Python 3.4。

Python3沒有PyString_FromString功能。 Python3 str類型內部是具有復雜結構的unicode對象。

使用PyUnicode_FromStringPyUnicode_FromStringAndSizeUTF-8編碼的C字符串( char* )構造str對象。

移動你的

#include "boost/python.hpp" 

...在你的其他包括之前,它將解決你的問題。

實際問題是Scott Deerwester在他的回答中所描述的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM