python中调用C++写的动态库
一、环境:Windows XP + Python3.2
1. dll对应的源文件(m.cpp):
#include <stdio.h> extern "C"
{
_declspec(dllexport) int add(int a, int b)
{
return a+b;
} _declspec(dllexport) void print_sum(unsigned long ulNum)
{
while(ulNum != )
{
printf("The ulNum is : %u\n", ulNum--);
}
}
}
2. python源程序:
# coding=GBK from ctypes import *
import time if __name__ == '__main__':
time_begin = time.clock() #dll = CDLL("d.dll") # 加载dll方式一
dll = cdll.LoadLibrary("d.dll") # 加载dll方式二
print(dll.add(2, 6)) # 调用dll中add方法
dll.print_sum(100) # 调用dll中print_sum方法 t = time.clock() - time_begin # 计算时间差
print("Use time: %f" %t) # 打印耗时时间
运行输出:
E:\Program\Python>del The ulNum is :
The ulNum is :
The ulNum is :
...........
The ulNum is :
The ulNum is :
Use time: 0.003853 E:\Program\Python>
二、环境:Fedora12 + Python2.6
1. 动态库源文件(a.cpp):
#include <stdio.h> extern "C"
{
int add(int a, int b)
{
return a+b;
} void print_sum(unsigned long ulNum)
{
while(ulNum != )
{
printf("The ulNum is : %u\n", ulNum--);
}
}
}
编译指令:g++ -shared -o liba.so a.cpp
2. python源程序(del.py):
#!/usr/bin/env python
# coding=UTF-8 from ctypes import *
import time if __name__ == '__main__':
time_begin = time.clock() dll = CDLL("./liba.so") # 加载dll方式一(默认在系统lib库路径下查找.so文件)
#dll = cdll.LoadLibrary("./liba.so") # 加载dll方式二
print(dll.add(2, 6)) # 调用dll中add方法
dll.print_sum(10000) # 调用dll中print_sum方法 t = time.clock() - time_begin # 计算时间差
print("\nUse time: %s" %t) # 打印耗时时间
注意:Linux上用Python加载动态库时默认是从系统lib路径下是查找库文件的。所以在python中加载当前路径下的动态库的话,路径要写“./liba.so",否则会提示动态库文件找不到!
http://blog.csdn.net/joeblackzqq/article/details/7405992
http://blog.csdn.net/magictong/article/details/3075478(更详细的说明)
http://blog.csdn.net/oracleot/article/details/3851512(使用SWIG实现C++导出python接口的配置)
python中调用C++写的动态库的更多相关文章
- Qt打开外部程序和文件夹需要注意的细节(Qt调用VC写的动态库,VC需要用C的方式输出函数,否则MinGW32编译过程会报错)
下午写程序中遇到几个小细节,需要在这里记录一下. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 QProcess *process = new QProcess(this ...
- 使用ctypes在Python中调用C++动态库
使用ctypes在Python中调用C++动态库 入门操作 使用ctypes库可以直接调用C语言编写的动态库,而如果是调用C++编写的动态库,需要使用extern关键字对动态库的函数进行声明: #in ...
- Linux 下Python调用C++编写的动态库
在工程中用到使用Python调用C++编写的动态库,结果报如下错误: OSError: ./extract_str.so: undefined symbol: _ZNSt8ios_base4InitD ...
- 如何在python中调用C语言代码
1.使用C扩展CPython还为开发者实现了一个有趣的特性,使用Python可以轻松调用C代码 开发者有三种方法可以在自己的Python代码中来调用C编写的函数-ctypes,SWIG,Python/ ...
- java调用dll或so动态库文件(c++/c)
java调用dll或so动态库文件(c++/c) 博客分类: 工作 CC#C++JavaEclipse java调用dll或so动态库文件(c++/c)开发平台:Eclipse3.3.1.1+CD ...
- 【转载】cocos2dx 中 Android NDK 加载动态库的问题
原文地址:http://blog.csdn.net/sozell/article/details/10551309 cocos2dx 中 Android NDK 加载动态库的问题 闲聊 最近在接入各 ...
- 4.1 python中调用rust程序
概述 使用rust-cpython将rust程序做为python模块调用: 通常为了提高python的性能: 参考 https://github.com/dgrunwald/rust-cpython ...
- Django之在Python中调用Django环境
Django之在Python中调用Django环境 新建一个py文件,在其中写下如下代码: import os if __name__ == '__main__': os.environ.setdef ...
- Delphi调用C# 编写dll动态库
Delphi调用C# 编写dll动态库 编写C#dll的方法都一样,首先在vs2005中创建一个“类库”项目WZPayDll, using System.Runtime.InteropServices ...
随机推荐
- UVA 1212 Duopoly
题目: 两个公司进行投标,竞争一些channels,每个投标可以包含多个channels,且都有一定的收益,每一个channels只能为其中的一个公司利用,同时保证一个公司给出的投标中选中的chann ...
- word 中巧妙添加分隔线
- Andrord问题小结
问题描述:Gradle version 2.10 is required. Current version is 2.8.Gradle版本由2.8升为2.10后,发现所有依赖play-services ...
- Java——单例设计模式
设计模式:解决某一类问题最行之有效的方法.Java中23种设计模式:单例设计模式:解决一个类在内存中只存在一个对象. 想要保证对象唯一.1,为了避免其他程序过多建立该类对象.先禁止其他程序建立该类对象 ...
- 使用API查询天气
服务端代码 [HttpPost] public ActionResult GetWeather() { HttpWebRequest request = (HttpWebRequest)HttpWeb ...
- Sql中的Exists和in
最近学习数据库的分页算法,提到第一种 SELECT TOP 页大小 *FROM table1WHERE id NOT IN ( SELECT TOP 页大小*(页数 ...
- ps 网页布局
910 1680 找一个页面作为参考 双击小手回到正常视角 新建组 把他们放到一个组里 新建组改名(创意专家) 放入一个图片 内发光投影 Shiftalt 复制 新建组 改名创意案 ...
- jdbc select
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import ...
- GDAL的安装和配置(编译proj.4)
1.下载地址 http://trac.osgeo.org/gdal/wiki/DownloadSource 下面是两个版本: http://pan.baidu.com/s/1bntuXER (1.1 ...
- 一个Java项目的学习
1. java命令行的启动 首先是gradle build 其次是:java -Dabc.appid=1234 -classpath "a.jar:b.jar" com.ctri ...