• 自动发布工具版本从python2升级成python3后遇到的种种问题(涉及paramiko,Crypto,zipfile等等)


       从在公司实习到正式入职,一直还在被同事使用的是我写的一个自动发布工具。该工具的主要功能是:开发人员给出需要更新的代码包(zip格式),测试人员将该代码包部署到测服,这些代码包和JIRA数据库里的项目信息挂钩,同时这个工具也支持回滚代码包。因为涉及到sftp的相关操作,最初选择了paramiko这个饱受好评的第三方库。可是当时该库只支持Python2,所以我的这个自动化工具在Python2的环境下编写。

        最近又在写一个原创的WEB自动化测试框架,在Python3环境编写,所以我装了个虚拟机,WIN7 64bit搭建的是Python3的环境。不同项目切换来切换去实在麻烦,所以想着把自动化发布工具升级成Python3版本。在paramiko的官网查了一下,现在的paramiko已经支持Python3了!真是喜讯啊!于是我立即着手开始迁移代码,果然在这个过程中遇到了好些个问题,不过最终也都解决了,现罗列如下:


    一、Paramiko的安装:

        利用 pip install paramiko 可以方便地自动下载并安装paramiko以及它所依赖的pycrypto和ecdsa库,运行程序时却报错:

    import paramiko
      File "C:Python33libsite-packagesparamiko\__init__.py", line 31, in <module>
        from paramiko.transport import SecurityOptions, Transport
      File "C:Python33libsite-packagesparamiko	ransport.py", line 47, in <module>
        from paramiko.dsskey import DSSKey
      File "C:Python33libsite-packagesparamikodsskey.py", line 26, in <module>
        from Crypto.PublicKey import DSA
    ImportError: No module named 'Crypto'

        我利用pip下载Crypto却不行,也会报错缺少winrandom模块。


    解决方法:自己去Crypto官方下载代码包,采用 python setup.py build, python setup.py install的方法安装。我估计是pip安装时,某些原因致使程序无法定位到winrandom模块造成的。

    20150304更新:

      重装了系统,使用了python3.4.3,电脑里装的是VS2013,如果提示找不到vcvarsall.bat,可以更改 Python34Libdistutilsmsvc9compiler.py:

      query_vcvarsall(version, arch="x86"):

      #vcvarsall = find_vcvarsall(version)
      version = 12.0
      vcvarsall = 'C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat'

      如果仍提示找不到Crypto,请将Python34Libsite-packages文件夹下“crypto”重命名为"Crypto"。

      如果提示找不到winrandom模块,请将Python34Libsite-packagesCryptoRandomOSRNG t.py文件改为:from . import winrandom

      


    二、数据库模块的安装,用pymysql替换MySQLdb:

        当时用的是MySQLdb这个数据库模块,可是作者已经停止更新了。


    解决方法:我找到了一个模块:pymysql,这个模块应该是为了接续MySQLdb而生的…用法都没什么差别。


    三、zipfile:

        这个也是让我花了最多时间的,三个小时才搞定。我一开始并没有觉得这个模块的代码需要做什么改动,但是同事在用我Python3版的工具时发现一个问题,如果压缩包中有中文命名的路径或者文件名,程序就会编码错误。在网上查了一下,发现zip包文件名是gbk编码类型的,然后我才想起来,我在Python2版本中,为了在cmd窗口下完美支持中文,设定了默认编码:

    import sys
    sys.getdefaultencoding()
    reload(sys)
    sys.setdefaultencoding('GB2312')
    sys.getdefaultencoding()

        可是在Python3中没有"setdefaultencoding"这个方法!!看到了比较官方的解释,主要是他们觉得Py2中这个方法是很愚蠢的,而且在Python3中编码有很大的改动,默认采用utf8的编码,同时也摈弃了这个方法。

        我随后又在网上找到,说zip内部编码是IBM437,转换成相应的gb编码即可。原本我的操作是将整个压缩包extractall出来的,现在只能一个个提取。按照上面的思想,我尝试了一下,果然可以~


    解决方法:直接贴出我的源代码

    import zipfile
    z = zipfile.ZipFile(path, 'r')  #path是压缩包的路径
    
    for filen in z.namelist() :
                utf8name = filen.encode('IBM437').decode('GB18030')
                pathname = localpath + os.path.dirname(utf8name)  #这里的localpath是我自己设定的一个前缀路径
    
                if not os.path.exists(pathname) and pathname != "" :
                    os.makedirs(pathname)
                
                data = z.read(filen)
                fullfile = localpath + utf8name
    
    #如果是文件,就创建一个一样的
                if not os.path.exists(fullfile) :
                    fr = open(fullfile, 'wb') 
                    fr.write(data)
                    fr.close()
    #这里一定要用wb方式打开,因为Py3中,字符串以unicode编码存储,想要写入二进制文件时,必须先转换成字节类型bytes
    z.close()

        以上就是我将我写的发布工具从python2迁移到python3环境所遇到的主要问题,希望能和大家分享~




  • 相关阅读:
    在Eclipse中指定JDK
    VMware桥接模式下主机和和虚机间互相ping不通的处理方法
    CentOS7系列--10.1CentOS7中的GNOME桌面环境
    CentOS7系列--5.3CentOS7中配置和管理Kubernetes
    CentOS7系列--5.2CentOS7中配置和管理Docker
    CentOS7系列--5.1CentOS7中配置和管理KVM
    CentOS7系列--4.1CentOS7中配置DNS服务
    CentOS7系列--3.2CentOS7中配置iSCSI服务
    移动web开发(一)——移动web开发必备知识
    文章索引
  • 原文地址:https://www.cnblogs.com/noahzn/p/4133246.html
Copyright © 2020-2023  润新知