精华内容
下载资源
问答
  • C/C++和Python混合编程

    千次阅读 2018-08-28 20:35:17
    1、首先需要下载python源代码进行编译,源代码编译的过程访问如下链接:  编译python源码 2、创建一个win32控制台项目,项目名称为:InvokePython,如图:   3、然后将python源代码中的Include文件夹拷贝到该...

    1、首先需要下载python源代码进行编译,源代码编译的过程访问如下链接:

       编译python源码

    2、创建一个win32控制台项目,项目名称为:InvokePython,如图:

      

    3、然后将python源代码中的Include文件夹拷贝到该项目,如图:

      

     只是拷贝Include还不够,需要将源代码Python-3.5.4\PC目录下的pyconfig.h文件拷贝到Include目录,如下:

    然后在我们的main函数文件中添加如下代码:

    #include "stdafx.h"

    #pragma comment(lib, "D:\\VSWork\\CPPProject\\InvokePython\\InvokePython\\lib\\python35_d.lib")

    #include "Python.h"

    int _tmain(int argc, _TCHAR* argv[])

    {

             Py_Initialize();//使用python之前,要调用Py_Initialize();这个函数进行初始化

             PyRun_SimpleString("print('hello')");//执行print

             Py_Finalize();//调用Py_Finalize,这个和Py_Initialize相对应的.

             getchar();

             return 0;

    }

    如图所示:

    然后运行程序,发现会有报错,报错如下:

    Fatal Python error: Py_Initialize: unable to load the file system codec

    这个错误是因为python初始化环境的时候需要倒入系统运行库,我们将python源代码目录下的Lib目录拷贝到Debug目录,(Lib目录主要是python写的一个系统类库)如图所示:

    然后在main函数开头加上一句代码,设置python运行主目录:

    Py_SetPythonHome(L"D:\\VSWork\\CPPProject\\InvokePython\\Debug");

    如图所示:

    然后就可以运行了,如图所示:

    项目已经上传,可以在此下载

    点击下载

    展开全文
  • 基于C++和Python混合编程的WORD文档操作方法.pdf
  • 基于C++和Python混合编程的WORD文档操作方法
  • c++和Python混合编程

    2017-05-16 09:58:27
    1) 在vs的附加包含目录中添加Python的include路径;  2) 在vs Linker的附加库目录中添加python的libs路径; 3) 注意,如果安装的python是64位的,那么vs工程也要是一直对应的x64活动平台,否则会报“无法解析...

    1. 设置环境

    1) 在vs的附加包含目录中添加Python的include路径; 

    2) 在vs Linker的附加库目录中添加python的libs路径;

    3) 注意,如果安装的python是64位的,那么vs工程也要是一直对应的x64活动平台,否则会报“无法解析的外部符号 __imp__Py_Initialize”等错误

    4) 如果没设置pythonpath,需要在调用Py_SetPythonHome()之前,设置python搜索路径,  Py_SetPythonHome("C:\Python27");


    2. coding

    #include <iostream>    
    #include <Python.h>    
        
    using namespace std;    
        
    void HelloWorld();    
    void Add();    
    void TestTransferDict();    
    void TestClass();    
        
    int main()    
    {    
    cout << "Starting Test..." << endl;    
        
    cout << "HelloWorld()-------------" << endl;    
    HelloWorld();    
    cout << "Add()--------------------" << endl;    
    Add();    
    cout << "TestDict-----------------" << endl;    
    TestTransferDict();    
    cout << "TestClass----------------" << endl;    
    TestClass();    
        
    system("pause");    
    return 0;    
    }    
        
    //调用输出"Hello World"函数    
    void HelloWorld()    
    {    
    Py_Initialize();//使用python之前,要调用Py_Initialize();这个函数进行初始化    
    PyObject * pModule = NULL;//声明变量    
    PyObject * pFunc = NULL;//声明变量    
    pModule =PyImport_ImportModule("Test001");//这里是要调用的Python文件名    
    pFunc= PyObject_GetAttrString(pModule, "HelloWorld"); //这里是要调用的函数名    
    PyEval_CallObject(pFunc, NULL); //调用函数,NULL表示参数为空    
    Py_Finalize();//调用Py_Finalize,这个和Py_Initialize相对应的.    
    }    
        
    //调用Add函数,传两个int型参数    
    void Add()    
    {    
    Py_Initialize();    
        
    PyObject * pModule = NULL;    
    PyObject * pFunc = NULL;    
    pModule =PyImport_ImportModule("Test001");//Test001:Python文件名    
    pFunc= PyObject_GetAttrString(pModule,"add");//Add:Python文件中的函数名    //创建参数    
    PyObject *pArgs = PyTuple_New(2); //函数调用的参数传递均是以元组的形式打包的,2表示参数个数    
    PyTuple_SetItem(pArgs, 0, Py_BuildValue("i", 5));//0---序号i表示创建int型变量    
    PyTuple_SetItem(pArgs, 1, Py_BuildValue("i", 7));//1---序号//返回值    
    PyObject *pReturn = NULL;    
    pReturn = PyEval_CallObject(pFunc, pArgs);//调用函数    
    //将返回值转换为int类型    
    int result;    
    PyArg_Parse(pReturn, "i", &result);//i表示转换成int型变量    
    cout << "5+7 = " << result << endl;    
        
    Py_Finalize();    
    }    
        
    //参数传递的类型为字典    
    void TestTransferDict()    
    {    
    Py_Initialize();    
        
    PyObject * pModule = NULL;    
    PyObject * pFunc = NULL;    
    pModule =PyImport_ImportModule("Test001");//Test001:Python文件名    
    pFunc= PyObject_GetAttrString(pModule, "TestDict"); //Add:Python文件中的函数名    
    //创建参数:    
    PyObject *pArgs = PyTuple_New(1);     
    PyObject *pDict = PyDict_New(); //创建字典类型变量    
    PyDict_SetItemString(pDict, "Name", Py_BuildValue("s", "WangYao")); //往字典类型变量中填充数据    
    PyDict_SetItemString(pDict, "Age", Py_BuildValue("i", 25)); //往字典类型变量中填充数据    
    PyTuple_SetItem(pArgs, 0, pDict);//0---序号将字典类型变量添加到参数元组中    
    //返回值    
    PyObject *pReturn = NULL;    
    pReturn = PyEval_CallObject(pFunc, pArgs);//调用函数    
    //处理返回值:    
    int size = PyDict_Size(pReturn);    
    cout << "返回字典的大小为: " << size << endl;    
    PyObject *pNewAge = PyDict_GetItemString(pReturn, "Age");    
    int newAge;    
    PyArg_Parse(pNewAge, "i", &newAge);    
    cout << "True Age: " << newAge << endl;    
        
    Py_Finalize();    
    }    
        
    //测试类    
    void TestClass()    
    {    
    Py_Initialize();    
        
    PyObject * pModule = NULL;    
    PyObject * pFunc = NULL;    
    pModule =PyImport_ImportModule("Test001");//Test001:Python文件名    
    pFunc= PyObject_GetAttrString(pModule, "TestDict"); //Add:Python文件中的函数名    
    //获取Person类    
    PyObject *pClassPerson = PyObject_GetAttrString(pModule, "Person");    
    //创建Person类的实例    
    PyObject *pInstancePerson = PyInstance_New(pClassPerson, NULL, NULL);    
    //调用方法    
    PyObject_CallMethod(pInstancePerson, "greet", "s", "Hello Kitty"); //s表示传递的是字符串,值为"Hello Kitty"    
        
    Py_Finalize();    
    }    
    上面代码转自:http://www.cnblogs.com/Hisin/archive/2012/02/27/2370590.html

    展开全文
  • 使用PythonQt实现C++Python混合编程

    千次阅读 2020-04-19 00:12:51
    PythonQt提供了一种将python脚本语言嵌入到Qt ...可以参考我的上一篇文章,使用Qt QJSEngine实现JavaScript与C++混合编程 使用Python扩展。 很多知名的软件都是用python脚本的方式,扩展自己的应用程序: Blende...

    PythonQt提供了一种将python脚本语言嵌入到Qt C++程序中的简单方法。
    我们可以使用一种脚本语言,扩展我们的应用,Qt中对于脚本化扩展应用程序有两种方法

    很多知名的软件都是用python脚本的方式,扩展自己的应用程序,下面列举一下使用该方式扩展应用的知名软件:

    • Blender (开源三维动画制作软件)
    • Autodesk Maya (三维动画制作软件)
    • OpenOffice.org (跨平台的办公室软件套件)
    • MeVisLab (医学图像处理软件)
    • Scribus (桌面排版软件)

    参考链接:
    Embedding Python into Qt Applications
    PythonQt主页
    pythonqt源码下载

    下面介绍关于PythonQt的简单使用


    1. C++调用python脚本

    关于pythonqt的编译这里就不过多的介绍了,简单的说分为三个步骤:

    1. 下载官方编译好的python库或者自己编译python的源代码。
    2. 下载pythonqt的源码。
    3. 修改pythonqt工程配置文件中的python库的路径,直接编译即可。

    在使用pythonqt的时候,需要先对其进行初始化,使用头文件 PythonQt.h

    PythonQt::init();
    

    如果使用封装好的Qt类型,使用如下代码初始化,使用头文件 PythonQt_QtAll.h

    PythonQt_QtAll::init();
    

    使用函数 evalScript() , 执行python代码

    // 获取 __main__ python module
    PythonQtObjectPtr mainModule = PythonQt::self()->getMainModule();
    QVariant result = mainModule.evalScript("100 + 200", Py_eval_input);
    qDebug() << result;
    

    这里使用函数 PythonQt::self()->getMainModule() 获取 __main__ 模块,然后调用函数 evalScript 执行python 脚本。

    使用函数 evalFile() 执行一个python脚本

    PythonQtObjectPtr mainModule = PythonQt::self()->getMainModule();
    mainModule.evalFile(":example.py");
    

    执行python的函数,并传递参数

    mainModule.evalScript("def addFunc(num1, num2):\n   return num1 + num2");
    QVariantList nums;
    nums << 100 << 200;
    result = mainModule.call("addFunc", nums);
    qDebug() << "Called addFunc the result is " << result;
    

    2. python中调用C++

    (1)直接使用Qt中的模块

    如果编译了 PythonQt_QtAll 库,则可以直接使用Qt中提供的类,他提供了完整的QtAPI的python封装(包括C++类和QObject类的所有非槽函数、槽函数、信号、属性等等)。

    包括如下模块 QtCore、QtGui、QtNetwork、QtOpenGL、QtSql、QtSvg、QtWebKit、QtXml、QtXmlPatterns、QtMultimedia、QtQml、QtQuick ,这些模块都是作为 PythonQt 的子模块使用。 对于 QtQuick 的支持还处于实验性阶段,目前不支持从python中注册新的QML组件。支持多态比如 QEvent 和多继承比如 QGraphicsTextItem

    下面是一个实例:
    使用pythonQt制作如下的界面:
    PythonQt
    python中的代码如下:

    from PythonQt import QtCore, QtGui
    
    # 创建Widget和布局
    mainWidget = QtGui.QWidget()
    mainWidget.setWindowTitle('PythonWidget')
    mainLayout = QtGui.QVBoxLayout(mainWidget)
    
    # 创建TextEdit和一个按钮,并添加到布局
    textEdit = QtGui.QTextEdit()
    mainLayout.addWidget(textEdit)
    testButton = QtGui.QPushButton('OK')
    mainLayout.addWidget(testButton)
    
    # 点击按钮时执行的函数
    def onClicekedButton():
        textEdit.append('Hello PythonQt')
    
    # 连接信号和处理函数
    testButton.connect('clicked()', onClicekedButton)
    # 显示界面
    mainWidget.resize(800, 600)
    mainWidget.show()
    
    

    点击按钮时,文本添加字符串 Hello PythonQt

    (2)python中使用C++对象

    下面是使用C++的一个类:
    头文件

    class Widget : public QWidget
    {
        Q_OBJECT
    
    public:
        Widget(QWidget *parent = nullptr);
        ~Widget();
    
        Q_INVOKABLE void setTextEditText(const QString& text);
    
    private:
        QTextEdit* m_pTextEdit = nullptr;
    };
    

    cpp文件

    Widget::Widget(QWidget *parent)
        : QWidget(parent)
    {
        QVBoxLayout* mainLayout = new QVBoxLayout(this);
    
        m_pTextEdit = new QTextEdit;
        m_pTextEdit->setObjectName("TestTextEdit");
    
        mainLayout->addWidget(m_pTextEdit);
    }
    
    Widget::~Widget()
    {
    
    }
    
    void Widget::setTextEditText(const QString& text)
    {
        m_pTextEdit->setText(text);
    }
    

    使用函数 addObject() 添加一个对象到python环境中:
    调用如下:

    Widget w;
    w.show();
    // 添加一个对象
    mainModule.addObject("testWidget", &w);
    // 添加终端
    PythonQtScriptingConsole console(nullptr, mainModule);
    console.show();
    

    这里使用了 PythonQtScriptingConsole 类创建了一个python终端窗口。
    可以直接在终端中调用添加的对象的函数,这里可以调用槽函数、使用 Q_INVOKABLE 修饰的函数、属性、信号等。
    pythonqt
    同时也可以通过objectname定位到子控件:

    pythonqt

    (3)python中使用C++的类

    PythonQt提供了一种通用的方法,来实现不论继承QObject的类还是普通的C++类来封装类提供给python环境。

    如果想要在python中调用C++的类,只需如下三个步骤:

    1. 定义自定义类。
    2. 实现装饰器。
    3. 注册到Python环境中。

    通过继承QObject实现包装器,并以特定的命名完成构造等函数的实现。

    • SomeClassName* new_SomeClassName(…) 定义构造函数
    • void delete_SomeClassName(SomeClassName* o) 定义析构函数
    • anything static_SomeClassName_someMethodName(…) 定义静态函数
    • anything someMethodName(SomeClassName* o, …) 定义普通函数,这里的第一参数同必须是该类型的指针。

    注意:以上这些参数均要在槽函数中定义。

    下面是一个普通的类定义:

    // 测试普通类
    class NormalClass
    {
    public:
        NormalClass(){
            qDebug() << __FUNCTION__;
        }
        ~NormalClass(){
            qDebug() << __FUNCTION__;
        }
    
        QString m_sTestName = "";
    };
    

    对于没有继承自 QObject 的类,还需要加上如下代码

    // register it to the meta type system
    Q_DECLARE_METATYPE(NormalClass)
    

    下面是装饰器的定义

    class NormalClassWrapper : public QObject
    {
        Q_OBJECT
    
    public slots:
    	// Normal Class
        NormalClass* new_NormalClass(){ return new NormalClass; }
        void delete_NormalClass(NormalClass* o){ delete o; }
    
        void setTestName(NormalClass* o, const QString& name){ o->m_sTestName = name; }
        QString getTestName(NormalClass* o) { return o->m_sTestName; }
    
    	// Widget
        Widget* new_Widget(QWidget* parent = nullptr){return new Widget(parent);}
        void delete_Widget(Widget* o){ delete o; }
    };
    

    这里的 Widget 是之前定义的那个 Widget

    需要 注意 的是,如果是继承自 QObject 的对象,使用函数 registerClass() 注册;如果是普通的C++类,则需要使用函数 registerCPPClass() 注册。如果使用 registerCPPClass() 注册的继承自 QObject ,则不能使用默认的属性、普通函数、槽函数等等 QObject 特有的特性,除非在装饰器中自己实现相关的定义。

    下面是注册代码:

    // 注册普通类
    PythonQt::self()->registerCPPClass("NormalClass", "", \
        "example", PythonQtCreateObject<NormalClassWrapper>);
    // 注册继承自QObject的类
    PythonQt::self()->registerClass(&Widget::staticMetaObject, \
        "example", PythonQtCreateObject<NormalClassWrapper>);
    

    测试python脚本

    from PythonQt import *
    
    normalObj = example.NormalClass()
    normalObj.setTestName('不会飞的纸飞机')
    
    w = example.Widget()
    w.setTextEditText(normalObj.getTestName())
    w.show()
    

    作者:douzhq
    个人博客主页:不会飞的纸飞机

    展开全文
  • C++ Python混合编程

    千次阅读 2019-09-15 23:35:06
     C++python混合编程 (http://blog.sina.com.cn/s/blog_6ec980ee0101cgax.html) (http://www.cnblogs.com/lvpengms/archive/2010/02/03/1663071.html) ...
  • Python简洁的语法、对动态输入的支持解释性语言的本质,使得它在很多领域的大多数平台上都是一个理想的脚本语言,特别适用于快速的应用程序开发。C++继承了C语言的能力,能够使用指针直接操作内存,也可以嵌入汇编...
  • Python简洁的语法、对动态输入的支持解释性语言的本质,使得它在很多领域的大多数平台上都是一个理想的脚本语言,特别适用于快速的应用程序开发。C++继承了C语言的能力,能够使用指针直接操作内存,也可以嵌入汇编...
  • 一、说明:C++项目中用到python相关的知识,这两天研究了一下C++python混合编程,网上有很多这方面的介绍,但是怎么使用python类的构造函数中传参的介绍却没有,这里研究一下,分享出来。(C++和python相互调用的...
  • C++和Python混合编程

    2019-01-26 22:12:00
    为何人工智能(AI)首选Python?读完这篇文章你就知道了:... C++调用Python。。。。 C++调用Python包。。。 C++图像处理工具包:OpenCV(。。Eigen) C++点云处理工具包:PCL Matlab遥感图像处理 >...
  • C++和Python混合编程 - C++写python扩展

    千次阅读 2017-03-17 16:39:34
    早就听说过了对于复杂的系统一般会结合多种语言进行开发,最近摸索了下C++和Python混合编程,在此总结一下,做为笔记。 对于C++和python混合编程实际上包含两部分内容: 用C++写python扩展(extending): 即...
  • 编译版本:python 3.7.2(用来编译混合编程的) 发布版本:python-3.7.2.post1-embed-win32这个版本用来发布的,因为我们安装的版本实在是太大了。(这个方法也不是最优的,网上还有更优化的,我觉得差不多了能接受...
  • c/c++ 编译为 .so文件后 使用Python调用实现混编 c++ 有class 版
  • Qt中C++Python混合编程

    千次阅读 2019-03-21 16:51:42
    1.Qt中用C++调用Python文件的三种方法 https://blog.csdn.net/qq_41800188/article/details/79709452 2.Qtcreator中C++调用python方法 https://www.e-learn.cn/content/python/1322577
  • Python与c/c++混合编程

    万次阅读 2019-03-28 18:35:26
    Python时现在很火的一种语言,在云计算、人工智能、自动化测试等领域使用率非常高。之所以有这么大的市场使用率,python也是有它自己的独特之处,首先python易学,并且是一种解释性语言,不需要经过编译,并且它有着...
  • 因为我们编写c/c++引用python往往需要python的c接口,就是我们python安装目录的includelibs目录下面的头文件第三方库文件,即.h文件.dll文件。最简单的办法是在工程目录下放进include目录libs目录,即....
  • win10环境中在vs2015中实现c++调用python代码 方法一:通过c++API接口 参考:https://blog.csdn.net/sihai12345/article/details/82745350 总结:这种方法可以实现简单的python的代码、函数、类的调用,但是当...
  • 原标题:C语言可以和Python一起混合编程?两者相加无敌了!C语言是编程语言的祖母,但是随着一代一代的编程语言长大,所以祖母也是会拍在沙滩上的,很多小小伙伴应该都会学过或者了解C语言,因为软件系的会教嘛,...
  • DESKTOP-SJO8SMG:/mnt/c/Users/samu$ python3 Python 3.8.10 (default, Jun 2 2021, 10:49:15) [GCC 9.4.0] on linux Type "help", "copyright", "credits" or "license" for more ...
  • C/C++ Python混合编程

    万次阅读 2018-04-21 17:14:59
    作者:Jerry Jho链接:...属于混合编程的问题。较全面的介绍一下,不仅限于题主提出的问题。以下讨论中,Python指它的标准实现,即CPython(虽然不是很严格)本文分4个部分C/C++ 调用 Python ...
  • 很好的c++和Python混合编程文章

    千次阅读 2013-07-12 18:08:11
    很好的c++和Python混合编程文章 jackyhwei 发布于 2010-06-03 21:05 点击:7385次  来自:cppblog.com 本人是用vc2003+python2.5学习的,其它的也应该差不了多少 0. 坏境设置 把...
  • C++和Python混合编程[一]

    千次阅读 2018-09-10 10:02:45
    Python.h&gt; #include "someMagic.h" int main(int argc, char *argv[]) { std::cout &lt;&lt; "Hello, World!" &lt;&lt; std::endl; Py_Initialize(...
  • C++/Python混编代码

    2020-06-09 17:10:40
    文件包含tensorflow1.14模型文件(VGG16),pb格式的,C++调用python脚本程序代码,代码中包含向python文件中传值,并从python文件中取值。系统:ubuntu系统,编译器:qt5。
  • C++嵌入python脚本混合编程 /------------------------------------- 1.添加路径安装python3.7到默认路径 2.安装VS2017 express 4.7 03190简体中文 3.在项目->属性->常规里,配置<附加包含目录>,添加: ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 15,496
精华内容 6,198
关键字:

c++和python混合编程

python 订阅
c++ 订阅