在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
分享到:
相关推荐
`ctypes`是Python的一个标准库,它允许我们直接调用C语言编译的动态链接库,从而实现了Python与C/C++代码的交互。 首先,我们需要理解DLL是什么。DLL(Dynamic Link Library)是Windows操作系统中的一个共享库,...
总结来说,Python嵌入C/C++可以实现高级功能与高效性能的结合,通过Python的高级语法和C/C++的底层优化,能够解决复杂的问题。在实际应用中,可以根据项目需求灵活选择合适的嵌入方式,以达到最佳效果。
尤其是在高性能计算、数据处理和实时系统中,不同语言之间的协作可以充分利用各自的优势,例如Python语言的简洁性和快速开发能力,以及C/C++在执行速度和底层系统交互上的优势。本文档“使用Windows共享内存技术实现...
在IT领域,有时候我们需要在不同的编程环境中相互协作,例如在Visual C++(VC)项目中调用Python脚本。这可以极大地扩展VC程序的功能,利用Python的灵活性和强大的库资源,尤其是在处理IO操作(如读写文件)时。本文...
在IT领域,有时候我们需要在C++(Visual C++,简称VC)这样的编译型语言中调用Python脚本或函数,以利用Python丰富的库资源和灵活性。本篇将详细讲解如何在VC++项目中实现对Python函数的调用,以及提供一个名为...
这个例子中,C++调用了Python函数`calculation`,传递了一个整数5,并获取了返回的平方值。注意在C++中,需要正确处理可能出现的异常,并且在完成调用后,释放所有创建的Python对象以避免内存泄漏。 通过这种方式,...
在VC++环境中调用Python函数是一项常见的任务,特别是在开发混合应用程序时,可能需要利用Python的丰富库和灵活性,同时利用C++的性能和系统级访问。这个例子将介绍如何在不依赖boost库的情况下,通过Microsoft的...
"VCForPython27"是Microsoft为Python 2.7提供的Visual C++运行库,它是安装某些Python扩展模块,如MySQL驱动(通常称为`pymysql`或`MySQLdb`)所必需的,因为这些模块可能依赖于C编译的库。`VCForPython27`解决了...
它可能包含了如何在C++环境中正确地调用Python脚本和模块的示例,帮助开发者更好地理解和实践Python与VC的集成。 总结来说,将Python嵌入到VC项目中,可以充分利用Python的灵活性和C++的效率,实现复杂系统的高效...
描述中提到,“python编译C模块时,需要用到的VC编译器(适配器)”,这指的是Microsoft Visual C++ Compiler,对于Python 2.7版本,通常需要Visual Studio 2008或Visual C++ Compiler for Python 2.7。这个工具包解决...
这个库允许C++代码调用Python函数,同时也可以将C++类和对象暴露给Python,从而实现两者之间的无缝集成。 首先,我们来看一下这些文件的名称及其含义: 1. `boost_python-vc90-mt-gd-1_49.dll`:这是一个动态链接库...
Microsoft Visual C++ 9.0,也被称为VC++ 2008,提供了编译Python所需的运行时环境,使得Python可以调用C/C++编写的库。 【描述】中的信息告诉我们,如果在尝试运行某个Python程序或者安装需要C++扩展的Python包时...
Python提供了C API,允许C或C++程序直接调用Python的函数和模块,这为在C++中调用Python代码提供了可能。在这个例子中,"c++传递参数给python源码.rar"的压缩包中包含了一个VC2019项目,旨在演示如何在C++中调用...
在Python开发中,经常需要安装一些扩展模块,这些模块可能包含C或C++的源代码,需要编译成Python可以调用的二进制文件。在这个过程中,Python的setuptools或distutils库会依赖于一个外部的编译环境,特别是对于...
- SWIG通过解析C/C++头文件生成封装代码,这使得在Python等语言中调用C/C++代码变得简单。 - 该文档片段中提到了通过SWIG工具生成的`jsample.i`接口文件,它包含了要暴露给Python的C++函数声明。 - SWIG使用过程...
标题中的“python的pyqt5和vc2写的调取电脑摄像头程序”指的是使用Python编程语言,结合PyQt5库和可能的Visual C++(VC2)编译器来开发一个应用,该应用能够访问和利用计算机的内置或外接摄像头进行视频捕获。...
- 在DLL中定义对外接口,这些接口应该符合C语言的调用约定,因为Python可以通过ctypes库调用C兼容的函数。 - 在Python中,导入ctypes库并加载DLL。然后,可以像调用Python函数一样调用DLL中的函数。 2. **VC++...
OpenCV的DNN模块提供了对深度学习框架(如TensorFlow、Caffe、ONNX等)模型的支持,使得在C++中直接调用预训练模型变得可能。以下是一些关键步骤: 1. **模型准备**:你需要先下载Yolov5的预训练权重和配置文件。...
总之,Python35_d.lib和python35_d.dll对于在Visual Studio中使用Python进行C/C++扩展开发至关重要,它们提供了调试环境所需的支持,帮助开发者在创建、测试和优化Python扩展模块时获得更多的信息和控制。...
在多线程编程中,进程或线程的同步与互斥是确保程序正确性和效率的关键概念。本文将详细探讨四种常见的同步互斥控制方法,并结合C++语言进行讲解。 1. **信号量(Semaphore)** 信号量是一种用于线程间同步的机制...