Python中用Ctrl+C终止threading初始化的多线程脚本

在编写Python脚本的时候,难免会遇到使用多线程操作的情况。

正常情况下,我们都习惯在Shell中使用Ctrl+C终止脚本的执行,但是在多线程环境中,我们发现Ctrl+C并不能有效终止开启了多线程的脚本。

由于Python提供的threading模块并没有提供线程的退出接口,导致我们没有办法终止已经正常运行的线程,尤其是线程被阻塞在内核的情况下。

解决这个问题的办法就是在线程初始化之后设置为守护模式(setDaemon),并且不要调用join阻塞主线程。这样当主线程退出的时候,其他线程也随之退出了。

下面是我们解决这种问题的一个例子:

参考链接


Python 中用 Ctrl+C 终止多线程程序的问题解决

Python简单实现WebSocket

实现一个简单的聊天室程序,代码如下:

测试页面:

参考链接


python简单实现websocket

Ubuntu 16.04下用Python显示YUV格式的图片

YUV420p to RGB & view

UYVY/YUV422 to RGB and view:

原始链接


YUV to RGB : Python Imaging Library

Python matplotlib.pyplot.draw()在不同版本中的差别导致界面绘制异常问题

Ubuntu系统上进行如下配置:

之后执行如下测试代码:

上面的测试代码在Ubuntu 14.04.5版本上是可以正常执行的,对应的matplotlib的版本是matplotlib 1.3.1,但是放到Ubuntu 16.04.2系统上则是无法正常显示的,对应的matplotlib的版本是matplotlib 1.5.1

造成这个问题的原因在于matplotlib.pyplot.draw(),这个函数行为的改变,早期这个函数是同步更新界面的,后来的版本却变成了空闲异步更新界面,只有当matplotlib.pyplot.pause(interval)被调用的时候才会刷新界面。

所以只需要上面的代码修改成如下即可在不同版本之间兼容:

注意,我们在matplotlib.pyplot.draw()调用后面增加了matplotlib.pyplot.pause(interval)的调用。

貌似调用fig.canvas.flush_events()更合适

查看matplotlib的版本使用如下代码:

参考链接


Ubuntu 14.04系统上Python使用"subprocess.Popen"执行"source"命令报告错误“/bin/sh: source: not found”

使用如下的例子中的代码

运行的时候报告错误

这个错误发生的原因是subprocess.Popen执行Shell命令的时候默认调用/bin/sh,而source命令/bin/bash才支持的,因此导致错误发生,修改后的脚本如下:

注意添加的executable="/bin/bash",指明了执行脚本的执行程序是/bin/bash

参考链接


Calling the “source” command from subprocess.Popen

ubuntu 16.04执行letsencrypt的时候报告错误“ImportError: No module named datetime”

网站一直使用letsencrypt提供的HTTPS证书,这个证书的问题在于每隔三个月就必须更新一次,本次更新证书的时候,提示如下错误:

错误发生的原因在于letsencrypt自己构建了一个Python的虚拟环境来隔离,但是早期建立的虚拟环境中是缺少部分软件包的,而自身的BUG导致也没有重新更新虚拟环境,导致出现异常。

解决方法就是删除letsencrypt自己构建的Python的虚拟环境,然后继续执行脚本让他重建即可。

参考链接


TypeError: slice indices must be integers or None or have an __index__ method

执行如下Python脚本时

会遇到错误信息

这个提示非常具有迷惑性,会让人不知所措。

其实非常简单

这行导致整个数组变成了浮点数格式的数组,可以试着打印出结果,就会发现整个里面的数字完全变成了浮点数。

而浮点数是不可以用来作为数组的下标的。

修改成如下方式即可

请注意最后的

函数,强制转换浮点数为整数。

参考链接


错误异常slice indices must be integers or None or have

如何用Python PIL获取图片的RGB数值

参考链接


如何用Python PIL获取图片的RGB数值

Python 2.7在调用自定义类函数时候报错"exceptions.TypeError: 'int' object is not callable"

Python 2.7中按照如下方式定义类

在执行脚本的时候会报告如下错误

造成错误的原因在于Python 2.7中当类的成员变量跟方法名重名的时候,默认是使用类的成员变量,而成员变量是无法被调用的,因而导致报错。

解决方法就是避免方法名跟成员变量同名即可,比如上面的定义修改成如下方式即可