最近在研究热力图,发现了一篇可能有用的Python
模拟疫情扩散的文章,可以部分模拟热力图,整篇文章原文内容如下:
分类: Python
Python(KK 英语发音:/ˈpaɪθən/), 是一种面向对象、直译式计算机程序设计语言,由Guido van Rossum于1989年底发明,第一个公开发行版发行于1991年。Python语法简洁而清晰,具有丰富和强大的类库。它常被昵称为胶水语言,它能够很轻松的把用其他语言制作的各种模块(尤其是C/C++)轻松地联结在一起。
ubuntu 14.04.5下安装多版本Python(2.7.6/3.4.3/3.6.4)
系统环境:ubuntu14.04.5 LTS
,系统默认的python
版本为2.7.4/3.4.3
。
但是实际工作中,某些通过pip
安装的开发包需要不低于某个版本的python
才能正常工作,比如ansible-2.4.2.0
,明确只支持python-3.5
以上的版本。在低版本的python
上,无法正常运行。
而如果我们贸然更新系统python
版本的话,会导致系统异常。因此我们借助pyenv
实现基于用户的python
版本定制。
安装pyenv
:
查看可以安装的python
版本:
这里以安装python-3.6.4
为例,首先安装依赖:
安装python
:
该命令会从github
上下载python
的源代码,并解压到/tmp
目录下,然后在/tmp
中执行编译工作。若依赖包没有安装,则会出现编译错误,需要在安装依赖包之后重新执行该命令。
安装完成之后,需要使用如下命令对数据库进行更新:
查看当前已经安装的python
版本
其中星号代表是当前系统正在使用的python
版本是系统自带的。
设置全局的python
版本
从上面,我们可以看出来当前的python
版本已经变为了3.6.4
。也可以使用pyenv local
或pyenv shell
临时改变python
的版本。
如果需要还原设定的python
版本为系统自带的版本,则执行如下命令:
确认python
版本
上面的操作会导致在当前用户下,执行python
或者python3
命令的时候都会被定向到python-3.6.4
,如果只想执行python3
命令的时候被定向到python-3.6.4
,则可以直接删除python
这个链接:
安装pip
:
安装完成之后,需要使用如下命令对数据库进行更新:
注意事项:
- 输入
python
即可使用新版的python
- 系统自带的脚本会以
/usr/bin/python
的方式直接调用老版本的python
,因而不会对系统脚本产生影响 - 使用
pip
安装第三方模块时会安装到~/.pyenv/versions/3.6.4
下,不会和系统模块发生冲突 - 使用
pip
安装模块后,可能需要执行pyenv rehash
更新数据库
参考链接
Python中用Ctrl+C终止threading初始化的多线程脚本
在编写Python
脚本的时候,难免会遇到使用多线程操作的情况。
正常情况下,我们都习惯在Shell
中使用Ctrl+C
终止脚本的执行,但是在多线程环境中,我们发现Ctrl+C
并不能有效终止开启了多线程的脚本。
由于Python
提供的threading
模块并没有提供线程的退出接口,导致我们没有办法终止已经正常运行的线程,尤其是线程被阻塞在内核的情况下。
解决这个问题的办法就是在线程初始化之后设置为守护模式(setDaemon
),并且不要调用join
阻塞主线程。这样当主线程退出的时候,其他线程也随之退出了。
下面是我们解决这种问题的一个例子:
参考链接
Python简单实现WebSocket
Ubuntu 16.04下用Python显示YUV格式的图片
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
。
参考链接
ubuntu 16.04执行letsencrypt的时候报告错误“ImportError: No module named datetime”
网站一直使用letsencrypt
提供的HTTPS
证书,这个证书的问题在于每隔三个月就必须更新一次,本次更新证书的时候,提示如下错误:
错误发生的原因在于letsencrypt
自己构建了一个Python
的虚拟环境来隔离,但是早期建立的虚拟环境中是缺少部分软件包的,而自身的BUG
导致也没有重新更新虚拟环境,导致出现异常。
解决方法就是删除letsencrypt
自己构建的Python
的虚拟环境,然后继续执行脚本让他重建即可。
参考链接
Python 2.7中PIL.Image转换为OpenCV支持的Image格式
TypeError: slice indices must be integers or None or have an __index__ method
执行如下Python
脚本时
会遇到错误信息
这个提示非常具有迷惑性,会让人不知所措。
其实非常简单
这行导致整个数组变成了浮点数格式的数组,可以试着打印出结果,就会发现整个里面的数字完全变成了浮点数。
而浮点数是不可以用来作为数组的下标的。
修改成如下方式即可
请注意最后的
函数,强制转换浮点数为整数。