我正在制作一个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();
}
我的.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:语法错误:&#39 ;;&#39;
C:\ Python34 \ include \ object.h:435:错误:C2238:&#39;之前的意外令牌;&#39;
C:\ Users \ Amol \ Desktop \ TestWidgetApp \ main.cpp:19:错误:C3861:&#39; PyString_FromString&#39;:未找到标识符
答案 0 :(得分:2)
这里的问题是Python 3.4有一个名为“slots”的结构成员,(文件object.h,在PyType_Spec
的typedef中),Qt从你下面定义,这样你就可以这样说:
public slots:
你的代码中的。解决方案是添加:
#undef slots
就在你包含Python.h之前,并在你包含任何使用Qt的方式使用“slots”的东西之前重新定义它:
#undef slots
#include <Python.h>
#define slots
#include "myinclude.h"
#include <QString>
有点黑客(因为你依赖于Qt中slots
的特定定义),但它应该让你去。
答案 1 :(得分:0)
我已从您的示例中删除了所有Qt代码,然后我尝试编译它(Qt与编译错误无关)。它为我编译。不同之处在于我使用了 Python 2.7 中的包含文件。
所以我在文件夹中搜索了字符串PyString_FromString
:C:\Python33\includes
(我注意到你使用的是python 3.4而不是3.3但是我怀疑这是一个3.x的东西< / em>)和C:\Python27\includes
。
结果:
Python 3.3
Python 2.7
因此,显然,BoostPython版本不支持Python 3.4。
答案 2 :(得分:0)
Python3没有PyString_FromString
功能。内部的Python3 str
类型是具有复杂结构的unicode对象。
使用PyUnicode_FromString
或PyUnicode_FromStringAndSize
从str
编码UTF-8
字符串(C
)构建char*
对象。
答案 3 :(得分:-1)
移动你的
#include "boost/python.hpp"
...在你的其他包括之前,它将解决你的问题。
实际问题正如Scott Deerwester在答案中所描述的那样。