从在公司实习到正式入职,一直还在被同事使用的是我写的一个自动发布工具。该工具的主要功能是:开发人员给出需要更新的代码包(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:\Python33\lib\site-packages\paramiko\__init__.py", line 31, in <module>
from paramiko.transport import SecurityOptions, Transport
File "C:\Python33\lib\site-packages\paramiko\transport.py", line 47, in <module>
from paramiko.dsskey import DSSKey
File "C:\Python33\lib\site-packages\paramiko\dsskey.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,可以更改 \Python34\Lib\distutils\msvc9compiler.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,请将\Python34\Lib\site-packages文件夹下“crypto”重命名为"Crypto"。

  如果提示找不到winrandom模块,请将\Python34\Lib\site-packages\Crypto\Random\OSRNG\nt.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环境所遇到的主要问题,希望能和大家分享~

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

  1. python2升级成python3

    系统环境centos 6.5原python版本2.6.6目标python版本3.5.11.下载python3.5wget --no-check-certificate  http://www.pyth ...

  2. Python第五十一天 python2升级为python3

    Python第五十一天  python2升级为python3 公司使用的生产环境系统是centos7,所以这里以centos7系统为基础,讲解将python2升级为python3的方法 centos7 ...

  3. Linux Python2 升级到 Python3

    国内企业服务器用 CentOS 系统的比较多,CentOS8 系统已经将系统默认 Python 版本调整为了 Python3,但是 CentOS7 的存量还是很大,毕竟对企业生产服务来说稳定大于一切, ...

  4. python2.7升级到python3后,用pip进行安装时报Fatal error in launcher:Unbale to create process using`""

    解决:python2.7升级到python3后,用pip进行安装时报Fatal error in launcher:Unbale to create process using`"" ...

  5. 用Python写一个将Python2代码转换成Python3代码的批处理工具

    之前写过一篇如何在windows操作系统上给.py文件添加一个快速处理的右键功能的文章:<一键将Python2代码自动转化为Python3>,作用就是为了将Python2的文件升级转换成P ...

  6. centos python2升级为python3 升级旧版本django

    阿里云centos python3 及django的配置 安装python3后 pip 会把下载的包安入python2.7 下面解决该问题 python3.5安装1,安装依赖包#yum install ...

  7. CentOS系统python默认版本由python2改为python3

    一.了解 CentOS中如果安装有yum,一般会有python2的某个版本.命令行键入python,出现的python2的环境: [root@instance-hrnebyqu src]# pytho ...

  8. Linux Centos7之由Python2升级到Python3教程

    1.先查看当前系统Python版本,默认都是Python2.7,命令如下: [root@localhost gau]# python -V Python 2.7.5 2.安装Python3,安装方法很 ...

  9. centos下python2升级为python3

    1.下载 下载地址 https://www.python.org/downloads/release/python-353/ 选择"Gzipped source tarball"这 ...

随机推荐

  1. Sysinternals Suite实用程序工具包

    Sysinternals Suite是微软出品的一套集成数十个绿色软件的实用程序工具包.就在2014年1月29日(官方日期),迎来了2014新版本 AccessChk为了确保创建安全的环境,Windo ...

  2. DragQueryFile

    附件:http://files.cnblogs.com/xe2011/CSharp_DragQueryFile.rar using System.Runtime.InteropServices; th ...

  3. linux jdk tomcat

    linux jdk tomcat mysql的安装 mysql的话,推荐使用命令行安装,而不是用外部的源码去编译,因为简单粗暴. mysql服务:sudo apt-get install mysql- ...

  4. hdu1864 最大报销额(01背包)

    转载请注明出处:http://blog.csdn.net/u012860063 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1864 Problem ...

  5. delegate和event

    经过查阅资料和自己的理解整理出来的,欢迎大家指教. delegate和event 何时使用: 异步的时候,比如加载完成通知. 需要回调的时候,比如按钮点击.动画播放结束等. 发送事件通知的时候. 比如 ...

  6. 传输层:TCP UDP SCTP

    总图 虽然协议族被称为“TCP/IP”,但除了TCP和IP这两个主要协议外,还有许多其他成员.图2-1展示了这些协议的概况. 图2-1中同时展示了IPV4和IPV6.从右向左看该图,最右边的5个网络应 ...

  7. Linux 确定系统glibc版本

    在shell中,可以直接运行glibc共享库文件获取glibc版本,CentOS下执行: /lib/libc.so. 输出为: GNU C Library stable release version ...

  8. day-8

    /* 倒数8天了 今天高考报名 两个班主任都来了23333 然后填班主任姓名就尴尬了23333 上午考试 挺不错的题目 都不是很水 但需要思考 而我是一脸的懵逼~~ 下午整理各种板子 主要是图论的 最 ...

  9. Jquery Ajax方法传递json到action

    ajax向后台传入json需要设置option,如下 contentType:'application/json' data:Json.Stringify(jsObj) 后台处理复杂json对象(不知 ...

  10. Android 设计随便说说之简单实践(合理组合)

    上一篇(Android 设计随便说说之简单实践(模块划分))例举了应用商店设计来说明怎么做模块划分.模块划分主要依赖于第一是业务需求,具体是怎么样的业务.应用商店则包括两个业务,就是向用户展示appl ...