zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Django对静态文件的处理——部署阶段
    使用Django来处理对于静态文件的请求
    Django1.7如何配置静态资源访问
    Spring WebSocket中403错误解决
    FastJSON JSONObject 字段排序 Feature.OrderedField
    国际化(i18n) 各国语言缩写
    【转】java.io.Closeable接口
    【转】spring bean 卸载
    This content should also be served over HTTPS
    Failed to close the ServletOutputStream connection cleanly, Broken pipe
  • 原文地址:https://www.cnblogs.com/crwy/p/10174389.html
Copyright © 2011-2022 走看看