[Tech] Python3升级记

当我写这篇文章的时候,离python2退休只有两年两个月零十天了,而当前的项目仍然使用python2的环境,被时代淘汰的紧迫感以及python2中类似编码的坑催促着我们来一场说升就升的级。下面就来分享一下在从python2到python3的升级过程以及遇到的坑吧。

1. 环境切换

step 1. 安装python3

强烈不建议不通过官网下载python3,我用的MacOS的homebrew下载的python3,环境变量配起来麻烦还容易出错。
大家可以通过官网 https://www.python.org/downloads/ 下载哦,我下的版本是3.6.4。

step 2. 虚拟环境切python3

我们需要的是python2到3的平滑升级,而且毕竟之前有很多用python2语法的项目,显然需要有一个工具可以简单的切换python2和python3,这里我们使用了virtualenv。
终端切到需要使用python3的项目,进行以下操作:

# 将原先的python2虚拟环境失效
deactivate origin_env

# 重建一个新的虚拟环境
virtualenv env3.6 --python=python3

# 使新环境生效
source env3.6/bin/activate

# 安装依赖
pip install requirements

平滑切换至python3~

2.代码修改

由于python2和python3的语法差异比较大,从python2升级到python3后我们还需要修改一下代码。

1. 引入修改

升级后首先就发现许多from ... import ... 出现了红线,这是由于python2在引入时首先会搜索当前目录下的文件,当找不到时再去根目录下搜索,随后去python搜索路径sys.path中搜索。而python3有些不同,它会直接在根目录下搜索再去python搜索。
假设我们的项目有这样的路径:

tests/
|
+--__init__.py
|
+--constants.py
|
+--models.py
|
+--case.py

当我们用python3在case.py中需要引入整个constants.py,另外还需要引入models.py的一个类,我们需要这样操作:

from . import constants
from .models import Model_A
2. os.path -> pathlib

当然,在python3下os.path也可以使用,但为了更彻底地使用python3,我们使用了python3的pathlib。
首先 pip install pathlib 进行安装哦,随后我们就可以使用pathlib操作啦~

项目配置文件(config.py)里往往都会有个获取项目根目录路径的全局变量ROOT_PATH,原先我们用以下代码来操作:

ROOT_PATH = pathlib.Path(__file__).cwd()

但执行用例后发现,这个ROOT_PATH并不是配置文件的路径,而且被执行用例的working directory。就比如说,我在tests/case.py中调了根目录下config.py里的ROOT_PATH,debug后发现ROOT_PATH竟然指向tests文件夹。查看case.py的配置文件(Run -> Edit Configuration),发现ROOT_PATH就指向其中的working directory,这显然不是我们想要的。

Edit Configuration

此时,就要用到绝对路径啦:

ROOT_PATH = Path(__file__).resolve().parent

Path(__file__).resolve()指向config.py的路径,而后面加一个parent则指向config.py的上层目录(即根目录的地址)。

之前用os.path时,我们会使用path.join来进行路径的拼接,那么pathlib里怎么操作呢?

p = Path.PurePath('foo', 'tests/cases')
print (p)    # 打印出'foo/tests/cases'

也可以酱紫:

p = Path.joinpath('foo', 'tests/cases')
print (p)

更详细的关于Path的介绍,可以参考这篇哦,Python3 操作系统与路径 模块(os / os.path / pathlib)

3. 数据类型

python2里的数据类型有int,long,float和complex,而python3不支持long类型了,其只有一种整数类型int,表示为长整型。=__= 默默把代码里的long全部改掉...
而在python2中的最大整型sys.maxint也要变成sys.maxsize咯。

4. map(), reduce(), filter()

当我改好上述的代码觉得万事大吉的时候,有一个case总也跑不过,我默默的比对了好几遍数据,怎么也不会想到是map()的问题。最后当我一条条数据debug时,才发现map()的返回怪怪的,在python2中,map()的返回是一个list,而python3中map()的返回却是一个iterable的对象,我们还需要将这个对象转换成list。

与此类似的,build-in函数filter()和zip()的返回结果也需要转换成list。

同样,reduce()也不能直接用了,需要从functools引入一下哦:

from functools import reduce
reduce(a,b,c)
5. http,urllib标准库

由于一直用的requests库发http请求,并未过多的使用http相关的模块,但是作为一些常用的标准库,这里还是需要提及一下。
python2中我们常用的httplib、 Cookie、 cookielib在python3中代替为http.client、http.cookies、http.cookiejar,几个包合并成了一个http包,引入的时候也应更加方便了吧。

Python 2 Python 3
import httplib import http.client
import Cookie import http.cookies
import cookielib import http.cookiejar

python2中用来分析、编码和获取URL的模块在python3中也统一组合成了一个单独的包urllib。

Python 2 Python 3
import urllib import urllib.request, urllib.parse, urllib.error
import urllib2 import urllib.request, urllib.error
import urlparse import urllib.parse
import robotparser import robotparser

踩了几个小坑后,python的升级之路还算顺利,走在技术前沿的自豪感油然而生。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,546评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,224评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,911评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,737评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,753评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,598评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,338评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,249评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,696评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,888评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,013评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,731评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,348评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,929评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,048评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,203评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,960评论 2 355