• 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需要做字符集转换的,不再需要,去除。
    import sys
    if 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'
    def f():
        exec s
        print x
    
    f()  # output 12
    
    # python3
    def f():
        exec(s, globals(), globals())
        print(x)
    
    f()  # output 12

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

        def set_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)

     

    参考资料:

    python2与python3的区别总结 - 简书

    Python2.x与3​​.x版本区别 | 菜鸟教程

    Python 2.7.x 和 Python 3.x 的主要区别 - yexiaoxiaobai - SegmentFault 思否

    Using a function defined in an exec'ed string in Python 3 - Stack Overflow

    python - Python3-Issue with calling exec(open().read()) inside a function - Stack Overflow

  • 相关阅读:
    Key and Certificate Conversion
    openssl
    python http通信实现
    鼠标右键添加cmd
    好文章
    wireshark里无网络接口解决办法
    python垃圾回收
    终于有人把 Docker 讲清楚了
    mongodb的监控与性能优化
    mongodb创建超级用户和普通用户(对应数据库的用户)
  • 原文地址:https://www.cnblogs.com/crwy/p/10174389.html
Copyright © 2020-2023  润新知