树莓派通过邮件上报实时IP,随时随地远程登录树莓派

树莓派接上键鼠和显示器就是一台普通的Linux的主机了,这样没什么好玩的。我的想法是只接网线和电源,将它作为一台永久运行的个人服务器,随时随地可以远程登录它,在上面跑耗时的爬虫代码等任务。

除了一台装好Linux系统(Raspbian)的树莓派,一根路由器给的网线,合适的放置环境,我们还需要做软件方面的配置。主要是如何从外网ssh登录到树莓派,昨天晚上写了个脚本解决了这个问题,这里分享一下。

电信分给用户的IP是动态的,我使用的一般是2天变化一次,重启路由器的话立即改变。ssh需要的就是ip和用户名,所以只要解决了ip的问题,就可以做到随时登录了。

1.路由器静态分配内网IP

路由器在内网分配的ip也是动态的,以我的为例,是tplink的路由器,内网的ip两个小时换一次,电脑重启立即改变。

解决方案比较简单。

  1. 打开路由器的管理页面(通常是192.168.1.1,不同型号也可能不同)。
  2. 在DHCP服务中将地址池设置为192.168.1.100-200,这样动态分配的ip会在这个范围。
  3. 设置静态分配。添加一个静态分配的规则,添加树莓派的MAC地址和静态分配的IP(要在局域网的网段,通常是192.168.1.XXX,而且不要在Step2设置的地址池范围内),我使用的是192.168.1.20.

JINGTAIFENPEI

如果不知道自己的MAC地址,可以在打开DHCP服务的时候查看一下。或者在树莓派中用ifconfig命令查看HWaddr

到此为止,任何时候只要你连接了这个路由器,就可以使用192.169.1.22登陆到树莓派系统了(通常情况下,路由器的设置都需要重启生效)。

2.外网IP和端口映射到内网

如果想要从外网登陆的话,还需要做一步映射。因为路由器分出了很多ip,如果外网访问某一端口的话,到底是访问了哪一个ip呢?

在路由器的「转发规则」页面添加一个对22端口(这个就是ssh端口)的转发,到192.168.1.20(你在上一节设置的IP)上。

zhuanfaguize

设置成功,你可以在 http://www.ip138.com/ 查看一下自己当前的ip是多少,然后尝试使用这个ip ssh登陆,正常情况下,是可以登陆的。

3.解决外网IP变化的方法

外网的IP一旦改变,原来的你记住的ip就失效了,解决这个问题,我用的方案是:树莓派每一个小时检查自己的公网ip,如果改变,就向我的邮箱发送一封邮件报告自己的最新ip。

原理是使用Linux的crontab添加定时任务,任务就是一个脚本,这个脚本来做check ip和发送邮件的功能。

操作步骤:

  1. 在树莓派上登录Root账户(sudo -s),因为这个程序要放在/root/rootcrons下而且添加为root的例行程序。
  2. 执行git clone https://github.com/laixintao/Report-IP-hourly.git /root/rootcrons/下载脚本代码(如果放在别的目录下,要注意调整后面的步骤相应的路径)。
  3. vi reportip.py设置邮件信息,修改代码的e-mail config部分:
    • smtpserver:你的SMTP服务器
    • username:你登陆SMTP的用户名
    • password:密码
    • sender:发送人,注意要和SMTP登录的账户对应,通常都是一个一个邮箱账户。
    • receiver:收信人列表
    • subject:邮件主题

    具体的修改信息,在代码中有详细的注释。

  4. 执行crontab /root/rootcrons/rootcron,将rootcroon的任务添加到crontab列表中。
  5. 重启crontab,使配置立即生效。/etc/init.d/cron restart

这时整个定时检查ip并发送邮件的功能已经实现了,下一节是解释代码和更高级的配置,如果没有兴趣可以跳过,去读一下「特别注意」(我惨痛的教训)。

如何得到树莓派的内网ip?

开一个socket,然后用python直接获得此socket的名字。代码像这样:

3.5添加开机启动

通过使用了一段时候之后,我发现,如果ip变化了,而树莓派启动的时间不是在整点的话,你只能等到下一个整点才能收到邮件了。所以这里我们再加一步,将脚本添加至开机启动里面。

这一步很简单,只要 vim /etc/rc.local ,然后添加下面一句话就可以了。

4.代码原理

最新版本的代码请看这里:https://github.com/laixintao/Report-IP-hourly

脚本会先检查网络是否连通,连通才会有后续的步骤。方法是访问百度是否正常返回结果(百度的主要功能是检查自己在不在线,不是搜索引擎)。

如果联通,则尝试获得公网ip,使用一个lastip.txt来保存ip地址,每次检查的结果和这个ip对比,如果相同,则不发送邮件。

那么如何获得公网ip呢?我的方法是去访问一个测试ip的网站,得到的html中用正则表达式去找ip。脚本中提供了三个网址,如果失败或者访问超时(默认20s),则尝试下一个。如果不能满足需要大家可以添加更多。

有朋友指出,我这里的地址已经失效了,并提供了下面两个可以获取ip的地址。

  • http://www.ip138.com/ip2city.asp
  • http://ipv4.icanhazip.com/
  • https://httpbin.org/ip  (这也比较稳定哦)

运行结果像下面这样:

reportip

详细的代码和注释请见github吧。

关于crontab

crontab filename是将任务添加到定时计划中,如果有需要可以更改rootcron的配置来控制脚本的执行频率。rootcron中的代码像下面这样:

  • 第1列分钟1~59
  • 第2列小时1~23(0表示子夜)
  • 第3列日1~31
  • 第4列月1~12
  • 第5列星期0~6(0表示星期天)
  • 第6列要运行的命令

例如,数字表示第x分钟或者小时来执行,*表示每分钟/小时等执行。详细介绍见文末参考。

5.特别注意

  1. 树莓派放置环境,注意温度不能太高。
  2. 如果1 2小节设置完毕之后测试失败,试一下重启路由器,路由器的设置一般都是在重启之后生效的。不同的路由器相应地菜单和设置方法可能是不一样的,有一些甚至没有提供转发功能。
  3. 不要使用常用邮箱给树莓派做发送用,这样不安全,最好申请一个邮箱专门给树莓派发送报告用。
  4. 添加到crontab之前最好手动执行一下(python reportip.py)来看一下代码是否能够正常执行,可以的话再添加到crontab。
  5. 如果代码有授权失败异常(503),先不要怀疑是自己的配置出错了,去邮件提供商,看一下设置里面的「客户端SMTP」是否允许了(别问我怎么知道的,申请了三个邮箱才反应过来啊!)。
  6. 收信箱请设置一个规则,例如标题带[RPI]的放到[RPI]的放到一个RPI文件夹,不提示。这样自己就不会被打扰,邮件也不会被扔到垃圾箱了。
  7. 特别重要!crontab执行脚本的时候运行环境是和我们直接在shell执行不一样的!!!所以crontab文件中的命令全部写绝对路径,例如/usr/bin/python /root/rootcrons/reportip.py这样。脚本中所有用到的配置都要写绝对路径,例如file文件存放的目录(两个小时才找到这个bug啊衰!手动执行正常,crontab就是不正常!)。

6.推荐使用

  • TP-link路由器:提供了映射服务,我的路由器支持花生壳动态解析,挺好用的。
  • Secure Shell for Chrome:配色好看,而且使用这个,无论你用Windows,mac,linux还是什么系统,只要有Chrome,就可以随时登陆ssh。

SCURESHELL-FOR-CHROME

JUICESSH

  • what for ios?:我没有iPhone,iPhone用户自求多福吧 :)。

7.其他获得解决动态变化的IP的方案

这些方法我也考虑过,有兴趣的朋友可以实现以下:

  1. 发送邮件的方式改为用网页公开。写一个html网页,然后用ftp上传到自己的服务器,这样每次想要看最新的ip的话只要打开这个网页看一下就行了。缺点:总觉得树莓派不安全,放这里ftp密码有点不放心。
  2. 有一种叫做动态解析的东西。缺点:花钱。

8.树莓派做服务器的缺点

树莓派做到7×24运行,不知道靠不靠谱,我是个稳重的人,所以给树莓派贴了两片散热铜片还装了个风扇。只是…………这破烂玩意太吵了,这么点个风扇比机箱还吵。

安卓使用app无法ssh登陆,估计是22端口被屏蔽了,因为我用vpn访问是正常的。

9.参考资料

最后,如果你遇到了本文没有解决的问题,可以留言或电邮,会在6个小时之内得到回复。

 

WordPress网站迁移方案

我的博客最近就要过期了,不知不觉这个小站已经到了400M左右大小(基本都是图片占用的资源),服务器空间续费的话需要升级更高配置的套餐了,当然也要花更多的钱。但是不选择续费,而重新购买一次空间的话,就可以便宜一百左右。动动手指麻烦一下,省下一百块,还是蛮值得的。网站迁移的方法记录一下,以后可能有用。

我的网站迁移过一共三次,第一次是从新浪博客(广告实在太多了,一点都不好用)搬到了一个独立的小站。这次迁移没有什么好说的,因为新浪没有提供导出的功能,只好一篇一篇地复制过来,幸好那时候写的东西还不是很多。不过新浪的图片还有防盗链,整篇复制过来之后,图片是无法显示的,只能再下载到本地,然后上传到新的博客,太坑了啊!

然后用了Godaddy的主机,很便宜,但是速度在国内访问实在是太慢了啊!于是我又换了一家国内的空间服务商,经历了一段惨痛的备案经历之后,选择了港台服务器。就是现在用的这样,速度还凑活吧。从Godaddy换到港台服务器的经历也很痛苦,使用的Wordpress的导入导出功能,步骤如下:

  1. 从旧的Wordpress导出xml文件。
  2. 在新的空间安装好Wordpress,然后导入xml。
  3. 导入xml。
  4. 从源站的content/uploads中down下来所有的图片,上传到新的站点。
  5. 布置新的站点,更换主题,做googlefont替换成国内的等等。

这种方式缺点很明显,基本是重新建一个站,只是文章一样。而且我上传图片的时候,由于是用一台Windows下载,然后再上传的,导致了图片名字的编码出现了问题,所有图片名字含中文的都无法显示了。(这也提醒我们,在往Wordpress传图片的时候最好使用英文文件名字)。

现在这一次还是同一家服务商,不过因为折扣的原因没有续费而是新开一个空间。吃了以前的亏,这一次使用的方案就简单得多,只花了十几分钟吧。

  1. 将旧站Wordpress的根目录(注意不是所有目录,注意不公开的隐私文件的安全性)使用ftp下载然后上传到新站。最好使用和网站相同的操作系统,否则可能出现编码不一致的问题。如果新网站的panel上提供了类似ftp或者网站搬家的功能,就在方便不过了,只要输入旧站的ftp用户名和密码,就可以直接拷到新网站。我的空间就有,而且速度很快,400M不到一分钟。
  2. 这时候数据库的配置文件还是旧站的,不能正常连接。解决方法是:删除Wordpress根目录下地config.php,打开主页,这时候就和第一次安装Wordpress一样,要求输入数据库的信息,配置完毕后,主页可以正常打开了。
  3. 将旧站的数据库数据迁移过来。使用PHPmyadmin或者空间提供商提供的MySQL备份导出源数据,再进行导入就可以了。
  4. 最后一步,不要忘了将域名指向新的空间地址。

好了,本站的迁移也已经完成了。话说一年的空间又花了好多钱,还因为国内坑爹的备案制度不能用大陆的服务器多掏了几百块,好心疼……

还是好好写博客吧,不能浪费了这些钱。

 

动听的代码:音乐编程语言Alda

什么是Alda?

Alda是一种强大灵活的音乐编程语言,只需要在编辑器中写一些代码,然后通过软件将其编译成声音,就可以产生各种风格的音乐。它的作者Dave竭尽所能来让这门语言简单易用,对初学者友好。Alda的目标之一就是让编程经验不多甚至没有编程经验的人试用其进行创作。通过它的口号——为音乐家设计的一门音乐编程语言——也能看出它传达出的对无编程经验者友好的价值理念。

尽管Alda语法的目标是至简易用,但是扩展性依然很好,提供给用户的自由度很高。通过音乐编程的方式来带给作曲家最少的限制,或许可以激发创作潜能,这也是作者的一个心愿。

目前,Alda可以使用通用乐器数字接口中的所有乐器来创作曲谱。在不久的将来,Alda将会支持从基本声波、音乐文件中的片段或者其他形式的声音来合成音乐。Dave的初衷是,让所有的程序员和非程序员都可以轻松地创作各种形式的音乐,从古典乐到8位音乐到实验音景——只需要通过一个编辑器和Alda解释器。

这篇文章将会介绍如何安装并使用Alda写一些基本的乐谱。但开始之前,我们要先来了解一些历史。

UNC和MML

Alda的起源可以追溯到2004年。那时Dave在北卡罗来纳大学学习作曲和电子乐的创作方式。他尝试了FruityLoops但是没有什么进展。后来,开始沉迷于音乐编程的世界。敲门砖就是MML,在当时(可能现在依然是)那是创作任天堂的8位数字音乐最佳的方式。读了NullsleepMML指南并开始学习如何创作基本的任天堂音乐之后,Dave就沉迷于凭直觉创作音乐当中。但那时候一颗音乐编程的种子也在他的心里悄悄埋下了。

MML对Alda的影响很大。Dave很痴迷在文本编辑器中创作音乐的过程,但是他想将音乐变成扩展到更广泛地领域中去,他想取代通过MML创作音乐的方式并将其应用到音乐合成、电子乐甚至是古典音乐中去。

古典音乐?

Dave在成为一个职业的程序员之前,他所受的音乐教育使他对各种各样创作音乐的形式产生了兴趣。生活在计算机文化氛围浓厚的环境中,Dave也尝试过使用图形界面的程序来作曲,比如用过Guitar Pro来写吉他谱,对于传统的音乐谱子,他还尝试过CakewalkNoteworthy ComposerFinaleSibelusMuseScore等等。

其中,Sibelius用的比较多,这款软件可以生成乐谱的数字版本,从而得到每一种乐器的乐谱,不同的音乐家就可以方便地了解自己所负责演奏的部分。这个功能非常实用。

像Sibelius这样的音乐谱曲软件对专业的作曲家来说是一种重要的工具。然而对于同样是作曲家和程序员的Dave来说,这种GUI音乐谱曲软件存在很多局限性:

容易使人分心

在软件普及之前音乐是写出来的,所有的科技就是纸和笔。乐谱的布局、音符等等各种东西都是产生自大脑而流于笔尖。但是使用图形界面程序的时候,要选择一个音符就要在一层一层的菜单中查找,注意力就这样被转移了: 1. 找到你想要的东西很不便捷,当你找到的时候,灵感已经走了; 2. 所有的音符都列出来供你查找同样让人分心,Dave使用Sibelius的时候就常常在长时间寻找音符的时候走神。

相比之下,使用文本编辑器编程来创作音乐的方式可以更让人集中尽力。

限制太多

Dave认为作曲家所需要的创作环境应该回归根本——从一张白纸开始。还要可以借助于21世纪科技的力量,电脑应该可以解释乐谱并转化成音频以查看效果。如果可以方便地转化成传统的乐谱供音乐家阅读就更好啦。

图形化的作曲软件在当下已经做得不错了,不过他们走了捷径——跳过了“从白纸开始”。当然,如果你用Sibelius从头开始创作,看起来也像是从白纸开始,但是却比物理上的手稿纸差的多。你不能拿起笔来就开始写下心中的灵感,那些图形界面背后隐藏的数字限制住了你。

所有图形化的音乐编辑器都走了这种捷径。为了将你心中的音符表现出来,这些限制是必须的。音乐编程语言同样有这种限制(从某种意义上说这是所有的软件都避免不了的),但是因为它的可视化需求不高,也不需要维持一个图形用户界面,这种限制就小得多,降到了可以接受的范围之内。Dave作为一个作曲家,觉得这恰到好处,令人鼓舞。

安装

注意:由于Alda还在开发中,所以必须按照下面的过程来安装和运行,Dave尽可能将这些步骤设计的直观,如果发生问题可以通过电子邮件来联系他。相信在将来,Alda一定会更加简单易用。

开始安装之前,你需要两个工具:

  • Clojure的编译工具Boot。如果你的操作系统是Mac OS X,可以选择使用Homebrew安装,命令是brew install boot-clj。其他平台的安装方式可以查看这里
  • Alda执行文件,可以将下面的代码复制到终端运行安装:

现在alda命令行工具就已经安装好了。它可以解释和播放Alda文件,或者接收一行Alda代码来作为命令的参数。你也可以通过Alda的REPL(Read-Evaluate-Play Loop,阅读、评估、播放循环)来迭代创作乐曲。

Alda 101

我们先来通过Alda的REPL来体验一下Alda的语法吧,通过下面这个命令可以在命令行启动REPL:

注意:Alda使用了一个叫做FluidR3的音色库使MIDI听起来更舒服,首次启动的时候需要花几分钟下载一个125M的文件,如果不愿意下载这个文件可以使用alda repl --stock命令使用Java虚拟机内建的MIDI合成器(效果很糟糕)。

FluidR3下载完成之后,你将会看到下面这样的界面:

现在你就可以尝试在REPL中输入一些Alda代码了,按下回车就可以立刻听见效果。

上文已经提到,MML和LilyPond对Alda的影响很大,尤其是它们简单的语法。下面将会描述它们像MarkDown一样简单的语法,基本上可以达到所见即所得的效果。

音符

先从简单的开始,将下面这个形式的乐谱改写成Alda代码:

一共有四个音符:C,D,E,F.相应地Alda代码是:

试着在REPL中输入然后按下回车……什么都没发生对不对?因为没有指定乐器呀!先用钢琴来试试:

这次你应该听到钢琴弹奏的这四个音符了。你会发现提示符从>变成了p>ppiano的缩写,表示目前的乐器是钢琴,除非做出更改,否则接下来的代码都会以钢琴播放。

音阶

让我们来试试更多的音符。

你应该注意到了钢琴声从C大调持续上升。>在Alda语法中表示下一个音阶上升。在科学音调符号中音阶从C大调开始上升至B,一旦超过B,就在一个新的音阶上重新从C开始。在Alda中,每一种乐器都从音阶4开始,知道你告诉它改变音阶它才会变。改变音阶有两种方式:使用><来提高或降低音阶;或者使用o接一个数字直接指定一个音阶。如下例:

变音记号

音调升高或降低可以在后面加+或者-号。

连续使用两个升/降调也可以:

事实上,音符和升/降调在Alda中可以随意组合,虽然两个以上的升/降调没有什么用,但是语法中也没有强制制止这种行为:

上面是代替E调的不必要且笨拙的做法。

音符长度

Adla中音符的默认长度是1/4,可以通过在音符后面接数字来改变,数字代表音符长度类型,例如4代表1/4音符,8代表1/8音符,16代表1/16音符等。当你指定了一个音符的长度之后,接下来的音符都会默认使用这个长度。

上例中使用了|符号。这个符号用来分隔两段音乐,在Alda语言中是可选的,编译器会忽略这个符号。|的作用是让程序可读性更高。

休止符

休止符在Alda中和音符差不多,类似于“听不见”的音符。休止符用r表示。

附点音符

Alda也支持附点音符,使用方法是在音符长度后面加.,可以加一个或多个。

连接符

通过连接符可以将两个音符连接在一起,Alda中的符号是~

和弦

在同一时间用一种乐器演奏不同的音符,这就是和弦。在Alda中,和弦用/分隔多个音符来表示。

注意,就像连续的音符一样,指定了一个和弦的音符会影响后面的音符的长度。

在Alda里一个和弦中不需要所有的音符都用一个长度,这个特性使创作音乐时和弦的使用非常方便。

在和弦中也可以使用><来改变音阶,这样描述和弦的升降音就很方便了。

声部

Alda中多音符同时演奏的另一种表现方式是声部。上面用和弦表达的例子也可以组合和弦和声部来表现:

退出REPL,只需要键入bye然后回车。

写一章乐谱

刚刚,我们已经在Alda里尝试了一些代码,并且听到了效果。这种方式在确认一段音乐之前测试片段非常有用,当确认了曲调的时候,就该把它们写成乐谱了。

在Alda中,乐谱就是文本文件,你可以使用任何你喜欢的文本编辑器来写。按照约定,文件名应该使用.alda结尾。在终端的当前文件夹下建立一个新文件,并命名为test.alda来试一下吧。

然后在文本中键入以下内容:

运行alda play --file test.alda,你将会听到优美的巴松管曲调。

属性

你可能会发现在这里用到了新的语法,下面就解释以下这部分。(quant XX)(XX的范围是0-99)是改变音符的长度,但是不改变它的持续时间。数值表示的是听到的音符长度的百分点。当你听到上面的音乐的时候,F音符和G音符(调整至30%)很短而且是间断的,最后的A音符(调整至99%)就很长而且是连续的。

quant(quantization的缩写)是一种可以在Alda中设置的属性。volume也是一种属性,可以设置音符的声音。像大多数的属性一样,volume(也可以写作vol)的取值也是0-100.可以通过逗号分隔多种属性。

试一下编辑test.alda如下:

运行alda play --file test.alda你将会听到前两个音符和后三个音符的不同。

说句题外话,你可能会发现每次运行alda命令都会等上一段时间。这是选择使用Clojure的一个坏处:Clojure有一个众所周知的毛病就是启动很慢。你也可以通过REPL来测试——只要启动一次,之后的使用中就不会受到影响了。

在不久的将来,Alda会实现提前编译,单独运行,速度将会得到提升。

乐器合奏

终于,到了最好玩的地方了:写多个乐器合奏的乐谱。

Alda乐谱支持无限多的乐器同时合奏,可以在test.alda文件中尝试下面的代码:

在这里两种乐器是单独谱曲,小号和长号,但是当播放乐谱的时候,两种乐器会同时和谐地一起演奏。

也可以一次只写一部分,像下面这样:

这段代码和上面的例子效果完全一样。值得一提的是,当你切换成另一种乐器的时候,之前使用的乐器部分依然存在,只不过处于一种“暂停”的状态,当你切换回来的时候,可以从上次的地方继续写。

全局属性

上文中介绍了改变volume属性,tempo(节奏)是另一个可以改变的属性,下面就来试一下:

听见了吗?小号的声音变成了200bpm的速度,但是长号依然没有变,是默认的120bpm。这不是bug,而是一项特性。Alda中tempo是基于每一项乐器来设置的,这样就可以给两件乐器设置不同的节奏。

设置全局属性可以更改所有的乐器设定,方法如下:

tempo!属性通过加一个!改变全局乐器的节奏,可以试一下(tempo! 200)等。

标记

接下来要介绍的是Alda的特殊功能——它可以使乐器完美的互相配合。

标记的概念是,给一个音乐段标注一个名字。名字可以包含数字、字母、撇号、破折号、加号、圆括号,前两个符号必须是字母。下面是一些合法的例子:

  • chorus
  • voiceIn
  • last-note
  • verse(2)
  • bass+drums

使用标记功能需要两步。第一步,在一个名字的开头加一个%给音乐段命名;第二步,使用@接名字来将乐器插入这个音乐段。如下例,可以将大号(tuba)插入到小号(trumpet)的last-note部分。

到这里,目前Alda的所有功能就介绍完了,如果有任何问题和建议通过邮件来和Dave联系。这个项目是开源的,如果你是一个Clojure程序员,可以通过PR来贡献代码

 

Python的哲学

PEP20是一条很有意思的命令:

执行之后,你将会看到一首名为「Python之禅」的诗,原文及翻译如下:

The Zen of Python,by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren’t special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one– and preferably only one –obvious way to do it.
Although that way may not be obvious at first unless you’re Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it’s a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea — let’s do more of those!

Python之禅,作者Tim Peters

优美胜于丑陋
明了胜于晦涩
简单胜于复杂
复杂胜于杂乱
扁平胜于嵌套
间隔胜于紧凑
可读性很重要
特例不足以特殊到违背这些原则
不要忽视错误,除非程序需要这样做
面对模棱两可,拒绝猜测
解决问题最直接的方法应该有一种,最好只有一种
可能这种方法一开始不够直接,因为你不是范罗苏姆
做也许好过不做,但不想就做还不如不做
如果方案难以描述明白,那么一定是个糟糕的方案
如果容易描述,那么可能是个好方案
命名空间是一种绝妙的理念,多加利用

 

Python 3.5的新特性

Python 3.5.0在9月13号正式发布,与3.4相比,有哪些让人期待的新特性呢?(Note:本文首发在CSDN,禁止任何形式的转载)

  • PEP441优化Python对zip压缩包的支持。从2.6版本开始,Python支持将文件或zip形式的压缩包作为脚本执行,对于有必要作为一个文件发布又复杂到要分模块管理的应用来说,这个功能很实用。但是这个功能却鲜有人知,原因之一是当时没有很好地宣传,只在What’s New中提到,没有写到文档中;原因之二是Windows没有为这种形式的文件(.zip)提供相应地Python扩展名(类似.py)。所以这一次的版本中重新发布了这个特性,并且,定义.pyz.pyzw作为“Python的zip应用”和“Windows下Python Zip应用”的扩展名,并提供了一个简单的管理工具。
  • PEP448解包操作更加方便。*作为可迭代的解包操作符,**作为字典的解包操作符。list,tuple等数据结构通过解包操作会得到分散的对象,例如,*range(4), 4结果得到(0, 1, 2, 3, 4)
  • PEP461%操作符支持对字节和字节数组的格式化。
  • PEP465新增矩阵乘法运算符’@’。 a @ b表示矩阵a乘矩阵b,也支持a @= b
  • PEP471新增os.scandir(),能够快速遍历目录。
  • PEP475提供系统调用中断时自动重试的支持。
  • PEP479StopIteration异常改在生成器内部处理。现在如果生成器raise一个StopIteration,将会替换为RuntimeError。因为这个特性不能向前兼容,所以最初是以__future__的形式发布的。
  • PEP484新增typing模块,类型注释的新标准。支持通过def greeting(name: str) -> str:这种形式声明函数,来注释输入和输出地数据类型。
  • PEP485新增math.isclose(),来判断近似相等。
  • PEP486优化Windows平台对virtualenv的支持。在Windows中Python如果安装了virtualenv或者多版本共存的话,需要配置解释器的路径来指定一个解释器执行,但是并不会区分虚拟环境还是系统环境,如果使用pip等命令行,影响的还是系统环境。本PEP使系统能感受到“虚拟环境的存在”,也就说如果没有特别指定解释器,Windows中运行Python命令的时候会影响活跃的virtualenv,如果没有,再调用默认的Python。
  • PEP488不再使用.pyo文件名。扩展.pyc,如果添加优化参数,字节码文件同目录下生成.pyc将会使优化后的版本,文件中会保存优化级别。
  • PEP489优化内置模块和扩展模块的加载。
  • PEP492支持async/await语法的协程。优化了Python的异步,添加了awaitable object协程函数异步迭代异步上下文管理器等。

其他CPython的优化

  • LC_TYPE localePOSIX locale(C locale)时,sys.stdinsys.stdoutsurrogateescape错误处理器,不再使用strict错误处理器。

标准库重要优化

安全优化

  • 标准库禁用SSLv3.
  • HTTP cookie,解析更加严格,以阻止潜在的注入攻击。

Windows优化

  • Windows新安装器,替换MSI.
  • Windows构建以及扩展模块现在使用Microsoft Visual C++ 14.0。

反馈

  • redsymbol说,Python3变得越来越好了,他使用3比2多三年,并深深地爱上了Python3.有时候不得不用2.7,就会感觉从第五代工具回到了二代。 对此有人反驳说,是“从二代回到五代”吧,Python3没有参数列表自解(parameter tuple unpacking by itself),用起来感觉非常不友好。orf对此回应:我用了7年多Python都不知道这玩意是什么,也没在代码中见过,移除难用的feature是一大进步,如果你接受不了的话,我很抱歉。Py3 is awesome.(跟帖中有一大堆关于这个feature的讨论)
  • “你们搞的这个typing模块啊,excited!”ricw提到,这个模块解决了Python最大的软肋,以后Python会变得越来越专业化。
  • ceronman说这是他最喜欢的3.X版本,Typing注释模块,async/await,解包广泛应用,这些功能都很赞,遗憾是PEP0498没有赶上这个版本,期待3.6(原帖又是长长的对这一feature的讨论).
  • 如果所有的东西都兼容Py3,这个世界就完美了 :)。