在ctypes的C共享库中调用Python函数

1. 概述

ctypes 是Python标准库中提供的外部函数库,可以用来在Python中调用动态链接库或者共享库中的函数,比如将使用大量循环的代码写在C语言中来进行提速,因为Python代码循环实在是太慢了。大致流程是通过 ctypes 来调用C函数,先将Python类型的对象转换为C的类型,在C函数中做完计算,返回结果到Python中。这个过程相对是比较容易的。

现在有个更复杂的情况,我想要在C代码中调用Python中的某些函数来完成C代码的计算,比如在C代码的sort函数中,采用Python中定义的函数来进行大小判断。这个在Python中定义的函数在 ctypes 中称为回调函数 (callback function)。也就是说需要把Python函数当作变量传给C语言,想想还是有些难度。 但调查以后发现 ctypes 提供了 CFUNCTYPE来方便地进行回调函数定义,而C语言本身也是支持函数指针的,因此这个功能实现还算简单,具体展开如下。

Read More

Linux小知识:apt install什么时候会出现 Do you want to continue?的提示

1. 一个故事

在大约十年以前,大二或大三的夏天,子浩 在科大西区活动中心的自习室内,给我帮忙安装Linux系统。当时他问了一个问题,用apt-get install 安装包时,什么时候会弹出Do you want to continue?Y/[n]的提示呢?我当时说应该是包大小超过限制时会有这个提示吧,但我们随即验证了这个假设并不成立,安装一个很小的包也会有这个提示。当时没有得到明确的结论。

这个问题时不时在脑海中想起,每次想查一下弄个清楚,但始终是没做。这样十年过去了,近日终于又想起来,通过谷歌搜索,终于发现了StackOverflow上已经又同样疑问的人提问了,而且得到了解答。至此这个小疑问算是解决了,我也不用每次念念不忘了。

具体原因是什么,请见下节。

Read More

Python转换elif语句为列表推导式

1. 概述

今天才发现,在Python的列表推导式里面,也可以使用多个else,也就是elif的情况,具体来说,可以将下面的一长串的elif 语句转换成一句列表推导式,大大简化代码:

1
2
3
4
5
6
7
8
if cond1:
do1
elif cond2:
do2
elif cond3:
do3
else:
do4

转换成列表推导式如下:

1
res = [do1 if cond1 else do2 if cond2 else do3 if cond3 else do4][0]

Python喜爱值+1,代码行数-N。

Read More

matplotlibt图像转OpenCV图像

1. 概述

有时候,我们需要使用Matplotlib库强大的绘图函数来在numpy.ndarray格式的图像上进行一些可视化,比如关键点绘制,投影点绘制。绘制完后,还需要把matplotlib的figure对象转换为numpy.ndarray 格式的对象,方便和原图进行比较。有时候为了可视化的美观,需要验证保证转换后的图像与原始图像大小一致。这里记录一下操作的流程,以及一些常遇到的问题。

Read More

git 提交文件中的部分修改

1. 概述

在 Git 提交一个文件的时候,有时候会在同一个文件中,包含两个不同功能的修改,或者一个功能完成了,而别的部分还没有完善不应该进入代码库,这时候如果使用git add file-name的话,会将这个文件中的所有更新都提交,达不到上述的需求。针对这种场景,git 提供了更细粒度的提交命令git add -p,可以分部分提交一个文件中的更新代码块,实测能满足常见的需求。这里简要记录一下如何使用这个命令。

Read More