当前位置: 首页 > news >正文

python dll_python调用C dll api

python调用c dll api

关键字: python dll调用 np类型转换 double

关于python调用dll的文章有很多, 本篇主要描述对double数组传参的实现, 本人还没有发现类似的文章, 因此书写本文档加以说明。

本文实现主要参考《用python进行科学计算》一书, 因此对环境有要求, 环境需要安装python(x,y), 该软件可以很好的支持numpy库,

否则用sf上下载的numpy安装包直接在python里安装貌似装了不生效, 也就是import numpy失败

下面简单讲下实现过程

1. 制作dll, 假设dll中有如下的导出函数, dll名为smooth

// @param: n 数组长度

// @param: x [input/output] 一维数组

// @param: y [input/output]

// @param: weights [input] 可为0

// @param: s [input/output] 单值,返回新的x,y长度

int smooth(int n, double* x, double* y, double* weights, double* s);

2. 加载dll

import numpy as np

from ctypes import *

dll = np.ctypeslib.load_library('smooth', '.')

3. 执行函数

c里的double是64位的, 因此简单的传参会是32位的, 比如用下面的实现就会有这样的问题

smooth = dll.smooth

#[Warning:下面是一个错误的演示]

#描述参数类型

smooth.argtypes = [c_int, POINTER(c_double), POINTER(c_double), POINTER(c_double), POINTER(c_double)]

#返回值类型

smooth.restype = c_int

x = [3.2, 3.9, 5.4, 5.9]

x = np.array(x)

y = np.array(x)

w = np.array(0)

s = np.array(10)

smooth(len(x), x.ctypes.data_as(POINTER(c_double)), y.ctypes.data_as(POINTER(c_double)), w.ctypes.data_as(POINTER(c_double)), s.ctypes.data_as(POINTER(c_double)) )

调用后python没有报错, 但不能得到正确的结果, 进入vc附加python进程, 在函数头加上断点, 查看参数内存, 可看出其是以int*方式传入的

要让python以真正的64位double*传入可使用下面的实现

#正确的调用

smooth.argtypes = [

c_int,

np.ctypeslib.ndpointer(dtype=np.float64, ndim=1, flags="C_CONTIGUOUS"), #一维数组,且内存连续的

np.ctypeslib.ndpointer(dtype=np.float64, ndim=1, flags="C_CONTIGUOUS"),

np.ctypeslib.ndpointer(dtype=np.float64),

np.ctypeslib.ndpointer(dtype=np.float64)

]

smooth.restype = c_int

m = [3.2, 3.9, 5.4, 5.9]

x = np.arange(4, dtype=np.float64)

y = np.arange(4, dtype=np.float64)

w = np.cast["float64"](0)

s = np.cast["float64"](10)

for i in range(0, len(m)):

x[i] = m[i]

y[i] = m[i]

smooth(len(x), x, y, w, s)

题外话: python的参数基本可以看为指针, 类似引用等操作都可以轻松完成

本人对numpy不是很熟, 可能对于np的参数初始化有更好的方式, 此处就算抛砖引玉吧,

posted on 2013-08-27 11:34 wangkang 阅读(2597) 评论(0) 编辑 收藏 引用

相关文章:

  • pythoncsv数据类型_pandas读取CSV文件时查看修改各列的数据类型格式
  • python标准库os的方法_Python标准库os.path包、glob包使用实例
  • python数字排序_python中如何对数字排序
  • 有趣的python项目_Python几个有趣和特别的小故事
  • python缩进格式错误修改_17个新手常见Python运行时错误
  • python什么是关键字参数_python的位置参数、默认参数、关键字参数、可变参数区别...
  • python数学计算函数_python之数学函数篇
  • linux双系统_windows下的Linux子系统,双系统的日子结束了
  • dos命令执行bat文件_dos命令tree图文教程,树形图形显示路径目录文件和文件夹...
  • python可以爬什么_Java可以像Python一样方便爬去世间万物
  • python二分法结果图_求助,python的二分法查找,按照视频上的代码写下来,结果运行错误...
  • vnpy怎么创建策略并回测_一步一步学vnpy
  • win7 安装c++2008失败0x80070002_3Dmax安装常见的六大问题
  • python百分号转义_Python 正则表达式(转义问题)
  • eclipse设置utf8编码_一篇文章搞懂Python 使用reload(sys)设置编码方式
  • Brief introduction of how to 'Call, Apply and Bind'
  • css布局,左右固定中间自适应实现
  • egg(89)--egg之redis的发布和订阅
  • github从入门到放弃(1)
  • JAVA_NIO系列——Channel和Buffer详解
  • Javascript弹出层-初探
  • Material Design
  • SpringCloud集成分布式事务LCN (一)
  • Zepto.js源码学习之二
  • 从零开始在ubuntu上搭建node开发环境
  • 大整数乘法-表格法
  • 代理模式
  • 汉诺塔算法
  • 后端_ThinkPHP5
  • 那些被忽略的 JavaScript 数组方法细节
  • 手写双向链表LinkedList的几个常用功能
  • 智能网联汽车信息安全
  • linux 淘宝开源监控工具tsar
  • #传输# #传输数据判断#
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • (1)bark-ml
  • (11)MSP430F5529 定时器B
  • (4)事件处理——(7)简单事件(Simple events)
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (力扣)1314.矩阵区域和
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (四)Linux Shell编程——输入输出重定向
  • (转)fock函数详解
  • (转)Windows2003安全设置/维护
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
  • .NET Micro Framework 4.2 beta 源码探析
  • .NET 使用 XPath 来读写 XML 文件
  • .NET 药厂业务系统 CPU爆高分析
  • .NET/C# 检测电脑上安装的 .NET Framework 的版本
  • .NET大文件上传知识整理
  • .NET开发不可不知、不可不用的辅助类(一)
  • [ 云计算 | AWS 实践 ] Java 如何重命名 Amazon S3 中的文件和文件夹
  • [04] Android逐帧动画(一)
  • [20171113]修改表结构删除列相关问题4.txt