本文针对Windows平台下,python调取C/C++的dll文件。

1.如果使用C语言,代码如下,文件名为test.c。

__declspec(dllexport) int sum(int a,int b)
{
return (a + b);
}

如果使用C++语言,代码如下,文件名为test_cpp.cpp。在Windows平台下,__declspec(dllexport)是必须要添加的。

#define DLLEXPORT extern "C" __declspec(dllexport)

DLLEXPORT int sum(int a,int b)
{
return a + b;
}

2.编译生成dll文件。

在Visual Studio中,生成的dll文件有32bit和64bit两种,需要和python的版本对应上,否则将会报出“WindowsError: [Error 193] %1 不是有效的 Win32”这个错误,如下图所示。

我的本机上python为python 2.7.9(64bit),因此需要在Visual Studio中将工程属性设置为64位的。设置步骤如下所示,相应的64位dll在x64目录下生成。

由于有的电脑上并没有安装C++ Run Time,如只安装32bit的python,依然加载不了32位的dll,会报出如下错误,“WindowsError: [Error 126] ”

参考http://stackoverflow.com/questions/10411709/windowserror-error-126-when-loading-a-dll-with-ctypes这个链接,需要将运行库改为“MT”模式。

3.python调用,代码如下:

from ctypes import cdll

dll = cdll.LoadLibrary('G:\keyphrase extraction\Test\TestForPython.dll')
print dll.sum(1,2)

输出结果如下:

ctypes变量类型、C语言变量类型和Python语言变量类型之间的关系如下所示:

参考:http://www.ibm.com/developerworks/cn/linux/l-cn-pythonandc/#icomments

FAQ:

1、如果只有一个dll,如何判断它是32位的还是64位的dll?

可以使用dumpbin工具,

在Visual Studio自带的dumpbin工具,然后输入dumpbin /HEADERS TestForPython.dll

machine后为(x64),可以看到这个dll是64位的;如果machin后为(x86),则为32位的dll。

参考链接:

http://wolfprojects.altervista.org/dllforpyinc.php

http://stackoverflow.com/questions/10411709/windowserror-error-126-when-loading-a-dll-with-ctypes

http://stackoverflow.com/questions/15374710/windowserror-error-193-1-is-not-a-valid-win32-application-in-python#

http://www.ibm.com/developerworks/cn/linux/l-cn-pythonandc/#icomments

http://blog.csdn.net/jamestaosh/article/details/4237756

http://gashero.iteye.com/blog/519837

python调取C/C++的dll生成方法的更多相关文章

  1. (转)python调取C/C++的dll生成方法

    本文针对Windows平台下,python调取C/C++的dll文件. 1.如果使用C语言,代码如下,文件名为test.c. __declspec(dllexport) int sum(int a,i ...

  2. python 调取 shell 命令的几种方法

    os.system()无法获得到输出和返回值 os.popen()output = os.popen('cat /proc/cpuinfo')print output.read()返回的是 file ...

  3. Visual Studio 创建和使用dll的方法

    DLL是一个包含可由多个程序同时使用的代码和数据的库. DLL文件就是把一些函数导出来,然后在新程序中进行复用的过程. 第一部分:使用Visual Studio 2010进行DLL的制作 生成方法一: ...

  4. 将Qt 动态链接生成的exe及依赖dll打包方法

    源地址:http://blog.csdn.net/ztz0223/article/details/8939341 将Qt 动态链接生成的exe及依赖dll打包方法 原文:http://www.qtcn ...

  5. C++ 生成 dll 和调用 dll 的方法实例(转)

    1)生成dll 建立两个文件 xxx.h , xxx.cpp xxx.h内容如下: #ifdef BUILD_XXX_DLL#define EXPORT __declspec(dllexport)#e ...

  6. 在ASP中调用DLL的方法

    .net的dll已经不是严格意义上的动态连接库了,而是一个类或者类库.它是不能直接在ASP.VB等其它的应用环境中使用的.   我们可以通过COM包装器(COM callable wrapper (C ...

  7. MSSTDFMT.dll系统文件(附2种MSSTDFMT.dll 注册方法)-系统增强

    MSSTDFMT.dll系统文件(附2种MSSTDFMT.dll 注册方法)-系统增强 msstdfmt.dll是微软标准数据格式对象相关动态链接库文件. msstdfmt.dll里面包含了定义好函数 ...

  8. Qt中纯C++项目发布为dll的方法(超详细步骤)

    众所周知,我们可以将C++项目中的类以及某些方法导出,形成 .dll 文件,以供其他程序使用,下面将说明Qt环境下的使用方法. 首先创建共享库,步骤如下: 下一步会出现类对话框等等,不用管它,直接点击 ...

  9. Python中os和shutil模块实用方法集…

    Python中os和shutil模块实用方法集锦 类型:转载 时间:2014-05-13 这篇文章主要介绍了Python中os和shutil模块实用方法集锦,需要的朋友可以参考下 复制代码代码如下: ...

随机推荐

  1. ZOJ-3820 Building Fire Stations 题解

    题目大意: 一棵树,在其中找两个点,使得其他点到这两个的距离的较小值的最大值的最小值及其方案. 思路: 首先显然一棵树的直径的中点到其他点的距离的最大值必定比其他点的小. 那么感性思考一下就将一棵树的 ...

  2. [BZOJ4196][NOI2015]软件包管理器

    4196: [Noi2015]软件包管理器 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1040  Solved: 603[Submit][Stat ...

  3. Redis_redis分布式锁-SETNX

    因业务需要使用了redis的SETNX来实现分布式锁. 描述:Redis有一系列的命令,特点是以NX结尾,NX是Not eXists的缩写,如SETNX命令就应该理解为:SET if Not eXis ...

  4. <十六>JDBC_使用 DBUtils 编写通用的DAO

    接口 : DAO<T>.java import java.sql.Connection;import java.sql.SQLException;import java.util.List ...

  5. HTML5新标签<canvas>

    基本用法 首先在body中写个<canvas>,设定大小,个人建议大小要在行内设置,不然在部分情况下会发生错误. CSS部分 给canvas加个边框,这边框只是为了方便看出canvas的边 ...

  6. 初识CoreData与详解

    Core Data数据持久化是对SQLite的一个升级,它是iOS集成的,在说Core Data之前,我们先说说在CoreData中使用的几个类. (1)NSManagedObjectModel(被管 ...

  7. WebService的开发、部署、调用

    本文参考其它文章和自己解决中间问题的经历记录,以C#开发WebService为例子,欢迎探讨: 一.C#开发WebService 在visual studio中新建ASP.NET Web服务应用程序, ...

  8. CSS基础篇之选择符2

    属性选择符: 选择符 版本 描述 E[att] CSS2 选择具有att属性的E元素. E[att="val"] CSS2 选择具有att属性且属性值等于val的E元素. E[at ...

  9. 1035-Spell checker(模糊匹配)

    一,题意: 给出一组字典的单词,以'#'结束,之后给出一组要执行模糊匹配的单词序列,以'#'结束 1,若某个单词能在字典中找到,则输出corret 2,若某个单词能通过 变换 或 删除 或 添加一个字 ...

  10. 玩转SQL Server复制回路の变更数据类型、未分区表转为分区表

    玩转SQL Server复制回路の变更数据类型.未分区表转为分区表 复制的应用: 初级应用:读写分离.数据库备份 高级应用:搬迁大型数据库(跨机房).变更数据类型.未分区表转为分区表 京东的复制专家 ...