`

python和C/C++的互相调用 VC

阅读更多
在C++中对Python进行调用,这里以VC2008为例。

    一个整体的思路就是,在这种互相调用的库或者函数中,我们做的所有事目的是让它们各自明白对方。既然PYTHON是C写的,那么它的调用肯定跟普通的LIB,DLL差不多。
首先安装PYTHON 2.5,在VC2008的Project->Properties, C/C++和LINKER->General->additional xxx中包含对应的头文件和lib目录

    在C++代码中包含#include<Python.h>,编译看看是否正确。debug版或许会缺一个xx_d.lib的调试文件,这个只要将原来版本的lib修改一下即可。
既然是调用python,就先用python写个函数
#callByC++.py

def Hello():
    print 'hello callByC++'


就下来就要考虑在哪个地方编译它.python已经提供了完善的模块接口,在C++代码里把这事干掉。
首先得让C++认到该文件,将该文件移到你的工程目录下,
接着在代码中键入如下:
int _tmain(int argc, _TCHAR* argv[])
{
     Py_Initialize();			//使用python之前,要调用Py_Initialize();这个函数进行初始化
     PyObject * pModule = NULL;	//声明变量
     PyObject * pFunc = NULL;		//声明变量
     pModule =PyImport_ImportModule("helloworld");	//这里是要调用的文件名
     pFunc= PyObject_GetAttrString(pModule, "Hello"); //这里是要调用的函数名
     PyEval_CallObject(pFunc, NULL);			//调用函数
     Py_Finalize();						//调用Py_Finalize,这个跟Py_Initialize相对应的。
     return 0;
}

运行完后,你会发现,你的py文件已经自动编译成pyc了.如果想移动你的exe,记得带上pyc


在Python中对C++进行调用


    参考PYTHON引入其他模块的语法,import *,无头文件概念。可以推出在dll的编译中必须以python的数据类型来进行代码的编写。新建一个DLL工程,在头文件和库文件的路径中设置好python的目录。关于DLL的创建其实很简单,回到开头所说的,我们做的事都是让它们各自明白对方。而dll的编制只不过在你用VC写完代码,按下F5时的整体工作中的一个步骤。如果写过LINUX的MAKEFILE人都明白,每个指定的C或者CPP文件都要编译成一个obj类型,然后主文件根据头文件的申明符号,去这些OBJ中寻找自己的函数代码,最后综合产生出二进制代码。所以说在DLL中做的事也一样,只要注意下他的格式说明。
    在为python写DLL的时候,必须有个initXX(XX表示你的DLL名字)函数。生成完后改名为.pyd。

static PyObject* mb_showMsg(PyObject* self, PyObject *args);

extern "C" __declspec(dllexport) void initmb()				//注意这里的名字
{
	static PyMethodDef mbMethods[] = {					//python无法直接用mb_showMsg访问
		{"showMsg", mb_showMsg, METH_VARARGS},
		{NULL, NULL, NULL} /*sentinel,哨兵,用来标识结束*/
	};	

	PyObject *m = Py_InitModule("mb", mbMethods);		      //"mb"是你外部的文件名
}

static PyObject* mb_showMsg(PyObject* self, PyObject *args)
{
    //我们的showMsg函数需要的是一个字符串参数
    const char* msg = NULL;
	LPWSTR wmsg = NULL;
	
	if (!PyArg_ParseTuple(args, "s", &msg))
        return NULL;

	int r;
	DWORD dwNum = MultiByteToWideChar (CP_ACP, 0, msg, -1, NULL, 0); //宽字符的转换,我的VC环境默认是UNICODE
	wmsg = new wchar_t[dwNum];

	if(!wmsg)
	{
	  delete []wmsg;
	  r = ::MessageBox(NULL, _T("conversion failed") , _T("Caption:Form C module"), MB_ICONINFORMATION | MB_OK);
	}
	else
	{
		MultiByteToWideChar (CP_ACP, 0, msg, -1, wmsg, dwNum);
		//调用MB
		r = ::MessageBox(NULL, wmsg , _T("Caption:Form C module"), MB_ICONINFORMATION | MB_OK);
		delete []wmsg ;		
	}

    //返回值
    return Py_BuildValue("i", r);
}


最后就可以“品尝”下最后的结果了。把dll文件拷到python目录的dlls下。名字改成mb.pyd.在python交互器中这么写
import mb
mb.showMsg("lin_style");



参考 http://hi.baidu.com/wenlongren/blog/item/c17eb0dae80844deb7fd48e7.html
参考http://blog.sina.com.cn/s/blog_4f927ca70100aeor.html
5
1
分享到:
评论
3 楼 cow13000 2010-03-30  
最近正要用到,谢谢LZ分享
2 楼 liyiwen007 2009-03-30  
任何一种方法,总会有应用的场合。
尽量多知道一点,就多一些手段嘛~
1 楼 simohayha 2009-03-30  
为啥不直接用boost的那个。。

话说给其他语言写c/c++扩展太无聊的说。。。

相关推荐

    Python中调用C++dll例子

    `ctypes`是Python的一个标准库,它允许我们直接调用C语言编译的动态链接库,从而实现了Python与C/C++代码的交互。 首先,我们需要理解DLL是什么。DLL(Dynamic Link Library)是Windows操作系统中的一个共享库,...

    Python嵌入C/C++进行开发详解

    总结来说,Python嵌入C/C++可以实现高级功能与高效性能的结合,通过Python的高级语法和C/C++的底层优化,能够解决复杂的问题。在实际应用中,可以根据项目需求灵活选择合适的嵌入方式,以达到最佳效果。

    使用Windows共享内存技术 实现Python与C_C++程序间的数据传递.pdf

    尤其是在高性能计算、数据处理和实时系统中,不同语言之间的协作可以充分利用各自的优势,例如Python语言的简洁性和快速开发能力,以及C/C++在执行速度和底层系统交互上的优势。本文档“使用Windows共享内存技术实现...

    VC项目调用Python文件脚本

    在IT领域,有时候我们需要在不同的编程环境中相互协作,例如在Visual C++(VC)项目中调用Python脚本。这可以极大地扩展VC程序的功能,利用Python的灵活性和强大的库资源,尤其是在处理IO操作(如读写文件)时。本文...

    VC调用Python函数,源代码

    在IT领域,有时候我们需要在C++(Visual C++,简称VC)这样的编译型语言中调用Python脚本或函数,以利用Python丰富的库资源和灵活性。本篇将详细讲解如何在VC++项目中实现对Python函数的调用,以及提供一个名为...

    vc++调用python源码(带返回值)测试

    这个例子中,C++调用了Python函数`calculation`,传递了一个整数5,并获取了返回的平方值。注意在C++中,需要正确处理可能出现的异常,并且在完成调用后,释放所有创建的Python对象以避免内存泄漏。 通过这种方式,...

    vc调用python函数的例子

    在VC++环境中调用Python函数是一项常见的任务,特别是在开发混合应用程序时,可能需要利用Python的丰富库和灵活性,同时利用C++的性能和系统级访问。这个例子将介绍如何在不依赖boost库的情况下,通过Microsoft的...

    VCForPython27和windows 系统下python 2.7 的mysql驱动

    "VCForPython27"是Microsoft为Python 2.7提供的Visual C++运行库,它是安装某些Python扩展模块,如MySQL驱动(通常称为`pymysql`或`MySQLdb`)所必需的,因为这些模块可能依赖于C编译的库。`VCForPython27`解决了...

    Python嵌入VC项目中

    它可能包含了如何在C++环境中正确地调用Python脚本和模块的示例,帮助开发者更好地理解和实践Python与VC的集成。 总结来说,将Python嵌入到VC项目中,可以充分利用Python的灵活性和C++的效率,实现复杂系统的高效...

    VCForPython27.zip

    描述中提到,“python编译C模块时,需要用到的VC编译器(适配器)”,这指的是Microsoft Visual C++ Compiler,对于Python 2.7版本,通常需要Visual Studio 2008或Visual C++ Compiler for Python 2.7。这个工具包解决...

    boost python 1.49 编译的库文件

    这个库允许C++代码调用Python函数,同时也可以将C++类和对象暴露给Python,从而实现两者之间的无缝集成。 首先,我们来看一下这些文件的名称及其含义: 1. `boost_python-vc90-mt-gd-1_49.dll`:这是一个动态链接库...

    VCForPython27.msi

    Microsoft Visual C++ 9.0,也被称为VC++ 2008,提供了编译Python所需的运行时环境,使得Python可以调用C/C++编写的库。 【描述】中的信息告诉我们,如果在尝试运行某个Python程序或者安装需要C++扩展的Python包时...

    c++传递参数给python源码.rar

    Python提供了C API,允许C或C++程序直接调用Python的函数和模块,这为在C++中调用Python代码提供了可能。在这个例子中,"c++传递参数给python源码.rar"的压缩包中包含了一个VC2019项目,旨在演示如何在C++中调用...

    Microsoft Visual C++ 14.0.rar

    在Python开发中,经常需要安装一些扩展模块,这些模块可能包含C或C++的源代码,需要编译成Python可以调用的二进制文件。在这个过程中,Python的setuptools或distutils库会依赖于一个外部的编译环境,特别是对于...

    python项目开发文档.pdf

    - SWIG通过解析C/C++头文件生成封装代码,这使得在Python等语言中调用C/C++代码变得简单。 - 该文档片段中提到了通过SWIG工具生成的`jsample.i`接口文件,它包含了要暴露给Python的C++函数声明。 - SWIG使用过程...

    python的pyqt5和vc2写的调取电脑摄像头程序.

    标题中的“python的pyqt5和vc2写的调取电脑摄像头程序”指的是使用Python编程语言,结合PyQt5库和可能的Visual C++(VC2)编译器来开发一个应用,该应用能够访问和利用计算机的内置或外接摄像头进行视频捕获。...

    VC程序与Python双向交互例程

    - 在DLL中定义对外接口,这些接口应该符合C语言的调用约定,因为Python可以通过ctypes库调用C兼容的函数。 - 在Python中,导入ctypes库并加载DLL。然后,可以像调用Python函数一样调用DLL中的函数。 2. **VC++...

    c++下使用opencv部署yolov5模型 (DNN)

    OpenCV的DNN模块提供了对深度学习框架(如TensorFlow、Caffe、ONNX等)模型的支持,使得在C++中直接调用预训练模型变得可能。以下是一些关键步骤: 1. **模型准备**:你需要先下载Yolov5的预训练权重和配置文件。...

    python35_d.lib和python35_d.dll

    总之,Python35_d.lib和python35_d.dll对于在Visual Studio中使用Python进行C/C++扩展开发至关重要,它们提供了调试环境所需的支持,帮助开发者在创建、测试和优化Python扩展模块时获得更多的信息和控制。...

    四种进程或线程同步互斥的控制方法

    在多线程编程中,进程或线程的同步与互斥是确保程序正确性和效率的关键概念。本文将详细探讨四种常见的同步互斥控制方法,并结合C++语言进行讲解。 1. **信号量(Semaphore)** 信号量是一种用于线程间同步的机制...

Global site tag (gtag.js) - Google Analytics