如何更新python的底层_Python: 下载底层由Python2转Python3环境更新手记

谨记录运行环境改变过程中所碰到的坑。

下载底层运行环境由Python2移至Python3所遇到的问题及处理方法:

1、所引的第三方组件,基本都有替代支持;msvcr90.dll不再需要,有则报错

2、引用当前目录下文件,前面要加.。Python2是首先搜索当前目录的

3、全面支持unicode字符,str不再有docode()方法,unicode()弃用。字串分为str与bytes两类,对应unicode与ascii,转换:

#bytes object

byte = b"byte example"

#str object

str = "str example"

#str to bytes 字符串转字节

bytes(str, encoding="utf8")#bytes to str 字节转字符串

str(bytes, encoding="utf-8")#an alternative method#str to bytes 字符串转为字节

str.encode(str)#bytes to str 字节转为字符串

bytes.decode(bytes)

# 所有Python2需要做字符集转换的,不再需要,去除。importsysif sys.getdefaultencoding() == 'ascii':

reload(sys)

sys.setdefaultencoding('utf-8')

4、通用的,Python3不支持print语句,只能用print函数。exec语句改为exec函数

5、字典类,其keys()、values()不再是list而返回迭代器,不能以key[0]做索引调用,去除了has_key()判断,全改为in操作符。iteritems弃用,而用items

6、同样,range()不再是列表是迭代器,而xrange弃用。列表须以list转

6、filter()返回迭代对象而非list,其不能再用sort()方法。同样还有map()

7、cookielib->http.cookiejar,urllib2->urllib.request,_winreg->winreg,HTMLParser为html代替

8、异常:弃用Exception, ex写法,改为Exception as ex。触发异常不能用Exception xxx,改为Exceptoin(xxx)

9、延时处理:threading._sleep(10)替换为time.sleep(10)

10、不等号<>弃用,全用!=;弃用long,全用int;整数除法可返回浮点数了

11、win_subprocess去除,结果待验证

12、execjs执行结果不对

13、regex替换,can't use a string pattern on a bytes-like object,被替换字串做utf-8解码。将urlopen().read().decode(’utf-8‘)以做转码。

14、函数中的exec代码动态执行问题:Python2中,exec code即可返回可用的全局对象,在Python3中,它需加globals()限定。

#python2

s = 'x = 12'

deff():execsprintx

f()#output 12

#python3

deff():exec(s, globals(), globals())print(x)

f()#output 12

15、回调函数设置问题。因api改变,而相关资料又少,这个坑,坑我太很:

defset_callback(self, c_callback):#3.0,api改了

if sys.version_info >= (3, 0):

PyCapsule_GetPointer= PYFUNCTYPE(c_void_p, py_object)(('PyCapsule_GetPointer', pythonapi))

PyCapsule_GetName= PYFUNCTYPE(c_void_p, py_object)(('PyCapsule_GetName', pythonapi))

c_callbackaddr=PyCapsule_GetPointer(c_callback, PyCapsule_GetName(c_callback))else:

PyCObject_AsVoidPtr= PYFUNCTYPE(c_void_p, py_object)(('PyCObject_AsVoidPtr', pythonapi))

c_callbackaddr=PyCObject_AsVoidPtr(c_callback)

CALLBACKFUNC_T=CFUNCTYPE(c_long, c_char_p, c_long)

self.callback= CALLBACKFUNC_T(c_callbackaddr)

参考资料:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值