python自动控制程序_巧用 python 脚本控制你的C程序

python是一门艺术语言,除了开发桌面程序,还能够开发网络应用,数据库应用,还可以代替shell编写一些的实用脚本,本文主要讲述了如何利用 python 程序控制你的 C 程序的行为。

作为例子,本文将用 python 和 C 语言来编写示例代码,同时也会顺便介绍一下 利用 C 语言扩展 python的方法,最后会给出完整的 C 编写 python 模块的源码。

首先考虑以下应用:假设你需要在项目中实现字符串排序比较的功能,但是事先并不确定应该如何排序(再次假设一下,如果某字符串中如果出现了 “aaa”, "bbb" 这样的子串,就将该字符串排在靠后的位置),此时如果用 C 语言实现了预定义的排序功能,那么万一某天需要改变字符串排序行为,就必须重新编写 C 程序的实现,并且再次编译项目,这样会浪费大量的精力,相反,如果将字符串排序的功能用 python 代码控制,即如何排序由python程序定义,这样将大大提高程序的灵活性。

以下就是示例程序,程序由 python 脚本和 C 编译的 python 模块组成,python 实现字符串比较功能,为了简化期间,本文只是先两个字符串大小的比较(用于说明 python控制程序行为已经足够),程序采用回调函数实现,完整代码如下:

python模块:

/** =====================================================================================

*

* Filename: ext.c

*

* Description:

*

* Version: 0.1.0

* Created: 09/16/2011 05:44:40 PM

* Revision: r1

* Compiler: gcc

*

* Author: Fu Haiping

* Company: ICT

*

* =====================================================================================*/#includestaticPyObject*my_callback=NULL;staticPyObject*_set_callback(PyObject*self, PyObject*args)

{

PyObject*result=NULL;

PyObject*temp;if(PyArg_ParseTuple(args,"O",&temp)) {if(!PyCallable_Check(temp)) {

PyErr_SetString(PyExc_TypeError,"parameter must be callable");returnNULL;

}

Py_XINCREF(temp);/*Add a reference to new callback*/Py_XDECREF(my_callback);/*Dispose of previous callback*/my_callback=temp;/*Remember new callback*//*Boilerplate to return "None"*/Py_INCREF(Py_None);

result=Py_None;

}returnresult;

}staticint_compare(constchar*a,constchar*b)

{longret;

PyObject*arglist;

PyObject*result=NULL;

arglist=Py_BuildValue("(ss)", a, b);

result=PyEval_CallObject(my_callback, arglist);

ret=PyInt_AsLong(result);if(result==NULL)return-1;

Py_DECREF(result);returnret;

}voidcompare(constchar*a,constchar*b)

{if(_compare(a, b)>0) {

printf("arg1 is greater than arg2\n");

}elseif(_compare(a, b)<0) {

printf("arg1 is NOT greater than arg2\n");

}else{

printf("arg1 is equal to arg2\n");

}

}staticPyObject*_compare_callback(PyObject*self, PyObject*args)

{constchar*a=NULL,*b=NULL;if(!PyArg_ParseTuple(args,"ss",&a,&b)) {returnNULL;

}

compare(a, b);

Py_INCREF(Py_None);returnPy_None;

}staticPyMethodDef

extMethods[]={

{"setcmp", _set_callback, METH_VARARGS},

{"compare", _compare_callback, METH_VARARGS},

{NULL, NULL}

};voidinitext()

{

Py_InitModule("ext", extMethods);

}

setup.py 文件:

fromdistutils.coreimportsetup, Extension

module1=Extension('ext',

sources=['ext.c'])

setup (name='ext',

version='1.0',

description='This is a demo package',

ext_modules=[module1])

执行过程:

$ python

Python2.6.6(r266:84292, Sep152010,15:52:39)

[GCC4.4.5] on linux2

Type"help","copyright","credits"or"license"formore information.>>>importext>>>defcompare(a, b):

...if(a>b):

...return-1...if(a

...return1...if(a==b):

...return0

...>>>setcmp(compare)

Traceback (most recent call last):

File"", line1,inNameError: name'setcmp'isnotdefined>>>ext.setcmp(compare)>>>ext.compare("aaa","bbb")

arg1isgreater than arg2>>>

上述执行过程中,我们利用了 pythoon 的 compare函数,该函数实现字符串的比较,如果 a > b, 返回 -1,a < b, 返回1, a == b, 返回0, 这和我们平常的比较方式相反,所以最后的结果中我们可以看到比较 "aaa", "bbb" 时,"aaa" 会比 “bbb” 大。

如果使用 python 定义我们常规的字母排序的比较函数,会看到如下执行结果:

>>>defcompare_ex(a, b):

...if(a>b):

...return1...if(a

...return-1...if(a==b):

...return0

...>>>ext.setcmp(compare_ex)>>>ext.compare("aaa","bbb")

arg1isNOT greater than arg2

此时,"aaa" 就比 "bbb" 小。

结论,以上只是一个小小的尝试,python的灵活性远远不止如此,Haippy会继续探索 python的一些有趣的特性和使用方法,请关注本博客后续文章。:-)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/567753.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

怎样考计算机教师资格证书,非师专生怎么考取计算机教师资格证书?

满意答案ff8410012013.04.08采纳率&#xff1a;41% 等级&#xff1a;12已帮助&#xff1a;22396人先要到户口所在地的教育局报名&#xff0c;报名的时间各地都不一样的&#xff0c;不统一&#xff0c;可以咨询当地教育局。。。如果你没有考教育学心理学和普通话就会组织你考…

基础功能-tensorflow使用gpu

方法一&#xff1a;这个会使用最小的GPU资源 config tf.ConfigProto() config.gpu_options.allow_growth True self.sesstf.Session(configconfig) 方法二&#xff1a; config tf.ConfigProto() config.gpu_options.per_process_gpu_memory_fraction 0.4 # 占用GPU40%的…

circle loss代码实现_Python全栈之路-23-使用Python实现Logistic回归算法

视频讲解地址使用Python实现Logistic回归算法_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bilibili.com本文代码地址​github.comLogistic回归是统计学习中经典的分类方法。二项Logistic回归模型概率分布如下其中为权重&#xff0c;为偏置。 一个事件发生的概率与该事件不发生的…

UserWarning: Matplotlib is currently using agg in Object Detection API

【解决办法】在models\research\object_detection\utils\visualization_utils.py 文件中&#xff0c;注释掉&#xff1a;import matplotlib; matplotlib.use(Agg)。如下图所示&#xff1a; 作者&#xff1a;LabVIEW_Python 链接&#xff1a;https://www.jianshu.com/p/5eaa66a5…

生物大分子的计算机模拟就业,生物大分子模拟

《生物大分子模拟》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《生物大分子模拟(14页珍藏版)》请在人人文库网上搜索。1、第一1、 computational biology计算机生物学是利用计算的方法对复杂生命现象和过程进行研究和预测的科学。它是理论与数据分析、数学建模和计…

c++堆栈溢出怎么解决_栈溢出基础

一. 基础知识什么是缓冲区溢出在深入探讨技术之前, 让我们先了解一下缓冲区溢出的实际内容.想象一个非常简单的程序, 要求你输入你的用户名, 然后返回到它在做什么.从视觉上看, 如下所示注意到括号之间的空格是输入用户名的预期空间.那个空间是我们的缓冲.处理用户名后, 返回地…

object detection训练自己数据

1、用labelImg标自己数据集。 并将图片存放在JPEGImages中&#xff0c;xml存放在Annotations中 2、分离训练和测试数据 import os import randomtrainval_percent 0.66 train_percent 0.5 xmlfilepath Annotations txtsavepath ImageSets\Main total_xml os.listdir(xml…

计算机检索word文档检索式,完整word版)中国知网等文献检索的一般方法

《完整word版)中国知网等文献检索的一般方法》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《完整word版)中国知网等文献检索的一般方法(9页珍藏版)》请在人人文库网上搜索。1、文献检索一般方法同学们&#xff1a;可能你们目前接触到的文献并不多&#xff0c; 但以后…

python数据处理和数据分析的区别_python数据处理(七)之数据探索和分析

1.探索数据 1.1 安装agate库 1.2 导入数据 1.3 探索表函数 a.排序 b.最值&#xff0c;均值 c.清除缺失值 d.过滤 e.百分比 1.4 连结多个数据集 a.捕捉异常 b.去重 c.缺失数据的处理 d.联结数据集 1.5 识别相关性 利用numpy分析 1.6 找出离群值 a.使用标准差 b.使用绝对中位差 &…

object detection错误Message type object_detection.protos.SsdFeatureExtractor has no field named bat

google.protobuf.text_format.ParseError: 35:7 : Message type "object_detection.protos.SsdFeatureExtractor" has no field named "batch_norm_trainable" 将pipeline.config中的 batch_norm_trainable: true 删除就可以。 在运行ssd_mobilenet_v1…

测试人多少岁的软件,抖音你的三观多少岁免费测试app

抖音你的三观多少岁免费测试app是一款非常好玩的三观测试软件&#xff0c;所谓三观&#xff0c;指的是价值观、人生观和世界观。三观对一个人的生活起着决定作用,所以拥有一个正确的三观太重要了。你的三观你了解么&#xff1f;如果对自己的三观比较模糊的用户可以通过这款软件…

基础功能4-画loss

1添加loss到txt文件 a[] for i in range(2):a.append(i) fileopen(data.txt,w) file.write(a) file.close()2从txt中读取并画图 list [] with open(data.txt, r) as f:for line in f.readlines():arr line.split(,) print(arr.__len__()) arr[0]arr[0][1:] arr[-1]arr[-1][…

苹果怎样用小米云服务器,苹果换华为/小米,怎么同步数据?教程来了!

原标题&#xff1a;苹果换华为/小米&#xff0c;怎么同步数据&#xff1f;教程来了&#xff01;由于系统不同&#xff0c;iOS和Android之间数据迁移一直都是跨平台换机用户的“绊脚石”。而且iOS是封闭系统&#xff0c;不像Android那么开源。尽管市面上的App基本都支持两大系统…

python中变量和函数的区别_python中带下划线的变量和函数的意义

Python 的代码风格由 PEP 8 描述。这个文档描述了 Python 编程风格的方方面面。在遵守这个文档的条件下&#xff0c;不同程序员编写的 Python 代码可以保持最大程度的相似风格。这样就易于阅读&#xff0c;易于在程序员之间交流。 1 变量 常量 : 大写加下划线1 USER_CONSTANT 对…

VS2015qt配置完成后添加菜单栏

再vs 中将.ui文件打开 即打开qt 在qt中 新建 mainWindow文件有菜单&#xff0c;保存 然后在vs 中的formfile中添加.ui文件 ,右击编译 会自动生成ui_XXX.h 文件 在自己建立.h .cpp文件

mycloud搭建网页服务器,WD MyCloud(V04)中配置WebDAV服务

MyCloud 升到V04(当前v04.01.00-408)后总是很脆弱&#xff0c;装个aria2一不小心就砖了&#xff0c;但是由于自带的Dashboard 就是基于 Apache &#xff0c;而且各种线索证明搭建WebDAV还是有戏的&#xff0c;步骤如下&#xff1a;准备工作0.SSH登陆到MyCloud1.建立目录首先建立…

github搜索技巧_和逛知乎、刷微博一样高效使用 GitHub

自打毕业之后&#xff0c;可以说每天打开 Github 或Email 看有没有 watch 项目的消息或者自己项目的 issue&#xff0c;然后在Explore 看看社区内项目的走势&#xff0c;紧接着开始写代码搬砖的工作&#xff0c;偶尔也会关注下 Github 的 Blog, 看看有没有大新闻&#xff0c;亦…

方舟服务器维护驯龙,方舟生存进化新手图文攻略 最详细的驯龙教程方法

《方舟&#xff1a;生存进化》很多新手玩家不知道前期如何生存&#xff0c;不知道有什么技巧&#xff0c;下面小编就为大家带来方舟生存进化的图文攻略&#xff0c;也就是新手图文攻略教程&#xff0c;希望对想要接触或这刚刚接触这款游戏的玩家有所帮助。首先&#xff0c;进入…

pyqt5 获取Qlabel中的图片并对其进行处理(包括Qimage转换为Mat)

1、提取Qlabel中的图片 qimgself.showScreenImgLabel.pixmap().toImage() 2、将Qimage转换为mat def qimage2mat(self,qimg):ptr qimg.constBits()ptr.setsize(qimg.byteCount())mat np.array(ptr).reshape(qimg.height(), qimg.width(), 4) # 注意这地方通道数一定要填4&…

服务器ios文件,ios 文件到服务器

ios 文件到服务器 内容精选换一换安装传输工具在本地主机和Windows云服务器上分别安装数据传输工具&#xff0c;将文件上传到云服务器。例如QQ.exe。在本地主机和Windows云服务器上分别安装数据传输工具&#xff0c;将文件上传到云服务器。例如QQ.exe。本地磁盘映射(推荐使用)使…