将python 3.4嵌入C++;Qt应用程序? 我正在制作一个Qt快速GUI应用程序(Windows),它使用OpenGL和C++来计算一些密集的东西。我想将python代码嵌入到应用程序中,以便在python中做一些相对容易的事情 基本上,我只希望C++代码调用Python脚本中的函数,让脚本执行任务,然后将返回的数据存储在变量(字符串或浮点等)中,以供进一步使用。我正在使用QtCreator,我得到了用于MinGW编译器的python3库。我尝试了一些代码,但看起来python库与Qt creator不太兼容。为此使用pyqt是一个好主意吗?做这件事最好最简单的方法是什么
编辑:这是我尝试的基本代码,首先它给了我一个错误,说找不到pyconfig.h。然后,我在python34 include目录中添加了一个INCUDEPATH将python 3.4嵌入C++;Qt应用程序? 我正在制作一个Qt快速GUI应用程序(Windows),它使用OpenGL和C++来计算一些密集的东西。我想将python代码嵌入到应用程序中,以便在python中做一些相对容易的事情 基本上,我只希望C++代码调用Python脚本中的函数,让脚本执行任务,然后将返回的数据存储在变量(字符串或浮点等)中,以供进一步使用。我正在使用QtCreator,我得到了用于MinGW编译器的python3库。我尝试了一些代码,但看起来python库与Qt creator不太兼容。为此使用pyqt是一个好主意吗?做这件事最好最简单的方法是什么,python,c++,qt,opengl,pyqt,Python,C++,Qt,Opengl,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); MainWindo
#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();
}
然后出现以下错误:
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':找不到标识符我已从示例中删除了所有Qt代码,然后尝试编译它(Qt与编译错误无关)。它为我编译。不同之处在于我使用了Python 2.7中的include文件 因此,我在文件夹中搜索了字符串
PyString\u FromString
:C:\Python33\includes
(我注意到您使用的是python 3.4而不是3.3,但我怀疑这是一个3.x的东西)和C:\Python27\includes
结果:
Python 3.3
Python 2.7
显然,Boostython版本不支持Python 3.4。Python3没有
PyString\u FromString
函数。Python3str
type内部是具有复杂结构的unicode对象
使用
PyUnicode\u FromString
或PyUnicode\u FromStringAndSize
从UTF-8
encodedC
字符串(char*
)构造str
对象。这里的问题是Python 3.4有一个名为“slots”的结构成员(file object.h,在PyType\u规范的typedef中),Qt从你下面定义了什么,这样你就可以说:
public slots:
在你的代码中。解决方案是添加:
#undef slots
在包含Python.h之前,以及在以Qt的方式包含任何使用“slot”的内容之前重新定义它:
#undef slots
#include <Python.h>
#define slots
#include "myinclude.h"
#include <QString>
#未定义插槽
#包括
#定义插槽
#包括“myinclude.h”
#包括
有点麻烦(因为您依赖于Qt中插槽的特定定义),但它应该可以让您继续。移动您的
#include "boost/python.hpp"
…在你的另一半之前,它将解决你的问题
实际问题是Scott Deerwester在他的回答中描述的。你能显示你尝试的代码并解释它为什么不起作用吗?在我看来,在PyQT+PyopGnl中构建应用程序要容易得多,如果需要的话,可以在C++模块中进行计算。Pyqt和PyOpenGL是围绕C++代码的包装器,所以它不会慢下来。如果你的计算使用了普通的例程(例如线性近似、矩阵乘法等),也有用C++编写的Python库,你可以跳过整个C++部分。RTFMK OK,我编辑并添加了我尝试的代码,你们现在可以删除这个保存吗?另外,我应该将包含乘法函数的py文件放在哪里?(代码基于以下文章:)它仍然给了我以下两个错误:C:\Python34\include\object.h:435:error:C2059:syntax error:';'代码>C:\Python34\include\object.h:435:错误:C2238:在“;”之前的意外标记代码>您确定在编译工具集中使用了正确的python版本吗?像bjam目标操作系统=windows/python=3.4
?或者至少定义PY_MAJOR_VERSION=3
和PY_MINOR_VERSION=4
。
#include "boost/python.hpp"