在Python中使用C程序
来源:互联网 发布:波段轻松涨停指标源码 编辑:程序博客网 时间:2024/05/21 19:41
很早就知道Python中可以方便的调用C程序,但一直没有尝试过。今天来试一试。环境ubuntu14.04LTS,Python2.7.6,gcc4.8.4。
首先准备在Python中要用到的C程序:
#include<stdio.h>#include<math.h>#define True 1#define Flase 0#define None -1int isprime(unsigned long long n)//*判断一个正整数是否是质数,//若是质数,返回True,其他,返回Flase{ unsigned long long i=0; unsigned long long sqn; short flag=None; if(n<2) { flag=Flase; } else if(n==2) { flag=True; } else if(n%2==0) { flag=Flase; } else { i=1; sqn = (unsigned long long)sqrt(n); do{ i = i+2; if( i > sqn ){ flag=True; } if( n%i == 0 ){ flag=Flase; } }while(flag==None); } return flag;}
把它保存成isprime.c,然后将它编译可被Python调用的成动态链接库,在ubuntu中可以用gcc这样编译:
gcc isprime.c -fPIC -shared -o isprime.so
其中各参数的含义是:
-fPIC
作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code),产生的代码中,没有绝对地址,全部使用相对地址,故而代码被加载器加载到内存的任意位置,都可以正确的执行。这正是共享库所要求的,共享库被加载时,在内存的位置不是固定的。
-shared
生成一个共享的目标文件,它能够与其他的目标一起链接生成一个可执行的文件。
-o isprime.so
输出文件名为isprime.so。.so(shared object)是Linux下的动态连接共享库文件,与Windows中的.dll对应。
然后运行如下代码调用isprime.so:
from ctypes import *import osisprime = cdll.LoadLibrary(os.getcwd() + '/isprime.so')print isprime.isprime(23)
注意os.getcwd() + ‘/isprime.so’是isprime.so文件路径,此处使用了os.getcwd()获取当前路径。按这样的写法,Python程序应与isprime.so在同一目录下。这样,就成功的在Python中使用了C程序。
Ctypes是python的外部功能库,允许调用DLL或共享库中的函数,并用纯Python封装这些库。从python2.5开始Ctypes成为了标准的模块之一。Ctypes还具有兼容C的数据类型,下表列出了Ctypes变量类型,C语言变量类型和Python语言变量类型之间的关系:
简单的使用示例如下:
from ctypes import *i = c_int(45)print i.value
这样,就可以直接在Python中声明C变量类型,调用C程序了。
更多高级用法参见 “浅谈 Python 程序和 C 程序的整合” 。
- 在Python中使用C程序
- 在Python中使用SWIG调用C和C++程序
- 【探索】在 JavaScript 中使用 C 程序
- 在Python中调用C++,使用SWIG
- 在C程序中使用popen调用shell脚本程序
- 使用Jpype在python中调用Java程序
- 在python中执行外部可执行程序,使用subprocess模块
- 如何在Python程序中使用二维数组
- 如何在C#Winform程序中正确使用登录窗体
- 如何在C程序中使用C++类
- 使用gdb在Android Emulator中进行调试c程序
- 在C语言程序中使用cURL库(libcurl)
- 初学Qt之--在C++程序中使用C函数
- 关于在R中使用C程序的一些问题
- 在python中使用C语言 [Linux Ubuntu]
- 扩展Python__在python脚本中使用其他语言(c/c++/java/c#)编写的模块
- C中使用python函索
- 在程序中使用中文
- 2.1.5—线性表—Median of Two Sorted Arrays
- react redux学习1
- 快速排序
- 4.使用JSP展示后台取到的数据(增删改查)
- PID调节之积分(D)调节
- 在Python中使用C程序
- git(十一)-git远程分支底层剖析
- 53. Maximum Subarray(java)
- 文章标题
- JasperReport报表技术导出PDF报表(使用IReport设计工具 )
- win10-64 下安装 tensorflow 和scrapy
- spring jdbcTemplate实现crud操作
- 机器学习精简教程之六——用随机梯度下降法(SGD)做线性拟合
- Eclipse连接数据库时出现Could not connect to New SQL Server