python调用linux底层函数,在Linux上实现Python调用C语言函数

一般思路

Python中内置ctypes库,需调用c编译成的.so文件来实现函数调用。

假设我们所需调用的c文件名为test.c,文件里有我们需要的函数func(x,y).

将.c文件编译成 .so文件

gcc -fPIC -shared test.c -o test.so

运行后会看到有test.so文件生成。

在Python中导入C文件

在当前目录下打开Python

import os

from ctypes import *

p = os.getcwd() + '/test.so’ #表示.so文件的绝对路径,如果你没在当前路径打开python则可能需要修改

f = CDLL(p) #读取.so文件并赋给变量f

这时如果没报错,就说明导入该.so文件成功了,可以调用脚本中的函数。

调用函数

# 变量为整数

a = 3

b = 4

f.func(a, b) #该步即运行函数func(x,y)

# 变量为浮点数

c = c_float(5.5)

d = c_float(6.66)

f.func(c, d)

以上便为调用C中函数的简单形式。

复杂情况

有时,在我们需要的C脚本中,调用了其他的库,或者也同时调用了以 .h形式被调用的同级别的C脚本。这种情况需要以下步骤:

将所有.c文件编译为 .o文件

该步骤就按你的需求去编译生成,但记得加入 -fPIC, 编译后生成一个或多个.o文件。如果你的C脚本只有一个(即并未调用其他同级别C脚本),当然只有1个.o文件。几个C脚本生成几个.o文件。

将所有.o文件编译为.so文件

gcc -shared -o main.so *.o *-lfftw3 *

上述命令将所有的.o文件编译为main.so文件,最后的-lfftw3表示C脚本中调用的其他库,我的是fftw3库,你需要加你自己调用的库名字。运行后可生成main.so文件

可用 ldd -r main.so查看.so文件,如果未出现undefined symbol,则编译应该是正确的。

运行脚本

如果你需要运行脚本而不是只用某个函数,可直接运行该脚本的 main函数

import os

from ctypes import *

p = os.getcwd() + '/test.so’

f = CDLL(p)

f.main() #运行C脚本中的main函数

python 调用c语言函数

虽然python是万能的,但是对于某些特殊功能,需要c语言才能完成.这样,就需要用python来调用c的代码了 具体流程: c编写相关函数 ,编译成库 然后在python中加载这些库,指定调用函数. ...

python 调用 C语言函数

python可以直接调用C语言的函数,本文记录用ctypes调用c语言的方法. test.c #include int test(char *temp) { print ...

【Python】python 调用c语言函数

虽然python是万能的,但是对于某些特殊功能,需要c语言才能完成.这样,就需要用python来调用c的代码了具体流程:c编写相关函数 ,编译成库然后在python中加载这些库,指定调用函数.这些函数 ...

python调用C语言接口

python调用C语言接口 注:本文所有示例介绍基于linux平台 在底层开发中,一般是使用C或者C++,但是有时候为了开发效率或者在写测试脚本的时候,会经常使用到python,所以这就涉及到一个问题 ...

Matlab调用C语言函数

Matlab调用C语言函数 如果我有一个用C语言写的函数,实现了一个功能,如一个简单的函数:double add(double x, double y) { return x + y ;}现在我想要在 ...

keil or c51 汇编调用c语言函数 容易忽视的问题

最近,在用keil 写一个小程序时,想实践一下从汇编调用 C语言函数,我们都知道C语言调用汇编函数讨论得较多,但反过来,从汇编中调用C语言的函数未见深入分析:在开始的时候,还是忽视了一个问题,就是对现 ...

在linux上安装python, jupyter, 虚拟环境(virtualenv)以及 虚拟环境管理之virtualenvwraper

一, 安装python31.下载python3源码 wget https://www.python.org/ftp/python/3.6.7/Python-3.6.7.tar.xz2.解压缩源码包,去 ...

Python调用R语言

网络上经常看到有人问数据分析是学习Python好还是R语言好,还有一些争论Python好还是R好的文章.每次看到这样的文章我都会想到李舰和肖凯的,书中一直强调,工具不 ...

从linux0.11中起动部分代码看汇编调用c语言函数

上一篇分析了c语言的函数调用栈情况,知道了c语言的函数调用机制后,我们来看一下,linux0.11中起动部分的代码是如何从汇编跳入c语言函数的.在LINUX 0.11中的head.s文件中会看到如下一 ...

随机推荐

微信企业号办公系统-图片预览放大功能-previewImage

在微信里看过文章的应该知道,文章里的图片点击后可以放大.分享和保存. 然而自己在微信里开发的网页,里面的图片点击后没办法实现这个效果,然后就去看了下微信JS文档,里面有个previewImage可以调 ...

神经网络hopfield的学习

Hopfield神经网络使用说明. 该神经网络有两个特点: 1,输出值只有0,1 2,Hopfield没有输入(input) 这里解释一下第二个特点,什么叫没有输入?因为在使用Hopfield网络的时 ...

redis与memcached比较

引用自:http://blog.csdn.net/e_wsq/article/details/23551799 最近需要用no-sql数据库来保存大量的数据,插入和查询都比较频繁,相对而言查询更加频繁 ...

c语言学习之基础知识点介绍(六):if和switch结构

本节主要说c语言中的分支结构. c语言中分支结构有两大类:一种是if,一种是switch. 一.if结构 //if结构,语法: //第一种: if(表达式){ //语句块 } //第二种: if(表达 ...

UE4上传图片到服务器

客户端代码: void AHttpTestCharacter::MyHttpCall(FString Url){ // TexturePath contains the local file full ...

vue框架构建项目流程

构建项目流程: 1.全局查询:node -v 2.全局初始化:npm install --global vue-cli 3.模块化工程:vue init webpack myapp--->y,n ...

[C#] 動的にアセンブリをロードする

アプリケーション ドメインにおいて起動時に読み込まれない別のアセンブリ (.dll や .exe) を読み込む場合.System.Reflection.Assemby クラスの Load メソッドを使 ...

node-js:文摘

ES6相关 1.module.exports与exports,export与export default之间的关系和区别 nodejs基础 1.NodeJs安装与全局配置(不建议修改包的全局安装路径, ...

HttpServletRequestWrapper使用技巧(自定义session和缓存InputStream)

一.前言 javax.servlet.http.HttpServletRequestWrapper 是一个开发者可以继承的类,我们可以重写相应的方法来实现session的自定义以及缓存InputStr ...

Oracle之SQL优化专题02-稳固SQL执行计划的方法

首先构建一个简单的测试用例来实际演示: create table emp as select * from scott.emp; create table dept as select * from ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值