工具:CodeBlocks

新建一个分享库工程( Shared library ),随便编写一个C代码的函数

// test.c

#include <stdio.h>

int fib(int n)
{
if( n == || n == )
{
return ;
}
else
{
return fib(n-) + fib(n-);
}
}

编译,在bin/Debug/目录中生成libtest.dll动态链接库文件,该文件可以通过ctypes模块进行访问使用,在该文件目录下新建一个test.py文件

# test.py

import ctypes
import os _file_path = os.path.join(os.path.dirname(__file__), 'libtest.dll')
_mod = ctypes.cdll.LoadLibrary(_file_path) #加载动态库文件,返回一个类对象 <class 'ctypes.CDLL'> # int fib(int n)
fib = _mod.fib #获取类方法
fib.argtypes = (ctype_int,) #配置参数类型(tuple)
fib.restype = ctypes_int #配置返回值类型 #现在可以直接使用fib函数了
for i in range(10):
print( fib(i), end=' ' )

C函数的指针作为参数情况

// 参数有指针的函数
int divide(int a, int b, int *remainder) {
int quot = a / b;
*remainder = a % b;
return quot;
}

# 相应的处理办法

# int divide(int, int, int *)
_divide = _mod.divide
_divide.argtypes = (ctypes.c_int, ctypes.c_int, ctypes.POINTER(ctypes.c_int))
_divide.restype = ctypes.c_int def divide(x, y):
  rem = ctypes.c_int()
  quot = _divide(x, y, rem)
  return quot,rem.value

C函数的数组作参数的情况

double avg(double *a, int n) {
int i;
double total = 0.0;
for (i = ; i < n; i++) {
total += a[i];
}
return total / n;
# 对于C中的数组,Python中没有固定的对应类型,所以要分类处理:
# Define a special type for the 'double *' argument
class DoubleArrayType:
def from_param(self, param): #对传进来的参数进行分发
typename = type(param).__name__
if hasattr(self, 'from_' + typename):
return getattr(self, 'from_' + typename)(param)
elif isinstance(param, ctypes.Array):
return param
else:
raise TypeError("Can't convert %s" % typename) # Cast from array.array objects
def from_array(self, param):
if param.typecode != 'd':
raise TypeError('must be an array of doubles')
ptr, _ = param.buffer_info()
return ctypes.cast(ptr, ctypes.POINTER(ctypes.c_double)) # Cast from lists/tuples
def from_list(self, param):
val = ((ctypes.c_double)*len(param))(*param)
return val from_tuple = from_list # Cast from a numpy array
def from_ndarray(self, param):
return param.ctypes.data_as(ctypes.POINTER(ctypes.c_double)) DoubleArray = DoubleArrayType()
_avg = _mod.avg
_avg.argtypes = (DoubleArray, ctypes.c_int)
_avg.restype = ctypes.c_double def avg(values):
return _avg(values, len(values))

Python使用ctypes访问C代码的更多相关文章

  1. 『Python CoolBook』使用ctypes访问C代码_下_demo进阶

    点击进入项目 这一次我们尝试一下略微复杂的c程序. 一.C程序 头文件: #ifndef __SAMPLE_H__ #define __SAMPLE_H__ #include <math.h&g ...

  2. 『Python CoolBook』使用ctypes访问C代码_上_用法讲解

    一.动态库文件生成 源文件hello.c #include "hello.h" #include <stdio.h> void hello(const char *na ...

  3. 第7.23节 Python使用property函数定义属性简化属性访问的代码实现

    第7.23节 Python使用property函数定义属性简化属性访问的代码实现 一.    背景       在本章前面章节中,我们介绍了类相关的知识,并举例进行了说明,在这些例子中会定义一些形如 ...

  4. 如何在python中调用C语言代码

    1.使用C扩展CPython还为开发者实现了一个有趣的特性,使用Python可以轻松调用C代码 开发者有三种方法可以在自己的Python代码中来调用C编写的函数-ctypes,SWIG,Python/ ...

  5. python学习(22) 访问数据库

    原文链接:http://www.limerence2017.com/2018/01/11/python22/ 本文介绍python如何使用数据库方面的知识. SQLite SQLite是一种嵌入式数据 ...

  6. python程序调用C/C++代码

    这篇用来记录在些模拟Canoe生成CAN数据桢工具时遇到的问题, 生成CAN数据桢,主要分为两个关注点: 1.如何从can信号名获取到can信号的ID长度以及信号的起始位,并将信号值按照一定的规则填写 ...

  7. 第14.7节 Python模拟浏览器访问实现http报文体压缩传输

    一. 引言 在<第14.6节 Python模拟浏览器访问网页的实现代码>介绍了使用urllib包的request模块访问网页的方法.但上节特别说明http报文头Accept-Encodin ...

  8. python解析xml模块封装代码

    在python中解析xml文件的模块用法,以及对模块封装的方法.原文转自:http://www.jbxue.com/article/16586.html 有如下的xml文件:<?xml vers ...

  9. 使用Python编程语言连接MySQL数据库代码

    使用Python编程语言连接MySQL数据库代码,跟大家分享一下: 前几天我用python操作了mysql的数据库,发现非常的有趣,而且python操作mysql的方法非常的简单和快速,所以我把代码分 ...

随机推荐

  1. php笔记(六)PHP类与对象之对象接口

    接口的实现 <?php //interface 关键字用于定义一个接口 interface ICanEat{ //接口里面的方法不需要实现 public function eat($food); ...

  2. group by 和count 联合使用问题

    工作中要根据用户发布的产品数量来排序做分页,使用group by uid 用count(uid) 来统计的数量和想要的数量不正确. count统计的数量是被group by 分组以后每一组中数据的数量 ...

  3. 为OLED屏增加GUI支持

    为OLED屏增加GUI支持1:OLED驱动 为OLED屏增加GUI支持2:2D图形库 为OLED屏增加GUI支持3:字库 为OLED屏增加GUI支持4:文本框控件 为OLED屏增加GUI支持5:图片控 ...

  4. JPA 系列教程20-JPA2.0-@CollectionTable

    @CollectionTable 指定集合表的详细信息,如果是JPA1.0必须再写一个Pojo类 ddl语句 CREATE TABLE `t_employee` ( `id` bigint(20) N ...

  5. python之~ 序列化与反序列化

    sy1.proto文件 syntax = "proto2"; message stuff { required int32 stuff_ID = ; required ; opti ...

  6. MySQL5.5.28启动错误 The server quit without updating PID file

    今天重新安装了一次 MySQL5.5.28 ,但启动的时候老是报错 Starting MySQL.. ERROR! The server quit without updating PID file ...

  7. bootstrip 折叠菜单

    body { font-family: "宋体"; font-size: 12px } .menu { height: 30px; background: #e6e6e6; mar ...

  8. Eclipse使用Maven tomcat:run命令启动web项目

    Eclipse安装好m2e插件,使用Maven构建项目后,启动web项目就行就非常简单了,你不再需要下载然后在eclipse中配置tomcat. 右键你的项目 -> Run As -> R ...

  9. Hack写法

    文章来源: http://www.w3cplus.com/css/create-css-browers-hacks 条件注释:http://www.w3cplus.com/create-an-ie-o ...

  10. 老oj1965:polygon半平面交

    题目链接:http://192.168.2.240:8080/JudgeOnline/showproblem?problem_id=1965 polygon半平面交 Time Limit:1000MS ...