接手一个活,不得不接,大肚皮生孩子去了,当时明显的感觉这是一个坑,交接的时候就一堆文档过来了,文档是很详细的,干活是纯手工打造的,纯手工打造的联测环境,相当的不容易啊。手工打造一辆车多少钱啊,据说劳斯莱斯就是纯手工的,我们的联测环境就是测试环境的劳斯莱斯啊,想到这里,你叔我不由得感觉这是一个高大上的事情啊。纯手工这事,叔本身还是比较擅长的,家里的洗衣机淘宝上买个配件就修好了。但
转脸一想,不对啊,这事纯手工打造,还不累死你叔我。所以,叔开始想想办法。叔最大的优点就是喜欢偷懒。能坐着绝不站着,能躺着绝不坐着。
叔虽然不是开发出身,也是粗通各种开发工具的,汇编、C、dephi、java都能写几句。要解决这种问题以前的思路那必须是delphi,RAD的开发理念,很快就能搞出一个小工具。想当年,form上画一个button,里面写一句代码,一编译就里面运行起来,button一点,浓墨重彩的HELLO WORLD马上呈现在你的面前,那感觉一个字,倍儿爽。
不过这个事放到现在,得拓宽思路。思来想去,觉得还是用脚本实现比较方便,所以决定用pyhon搞一把。python版本挺多,不过现在最流行的貌似是2.7,这个版本上的很多库都是可以拿来用的。3.0以上的版本有人说好有人说不好,搞不清楚。所以还是用老版的。
首先要解决的就是要把so上传到linux服务器。首先要找现在支持ssh协议的库。查了不少资料,最后知道了、
Python中使用SSH需要用到OpenSSH,而OpenSSH依赖于paramiko模块,而paramiko模块又依赖于pycrypto模块,因此要在Python中使用SSH,则需要先安装模块顺序是:pycrypto
-> ecdsa -> paramiko
装好之后,测试了ssh登陆,和sftp上传下载文件,都没有问题,当时叔龙颜大悦,马上下去到全家买了块面包奖励自己。
可是回来之后马上碰到了问题,作为一个苦逼中国的技术人员,首先面对的就是字符编码的问题,太烦人了,后来想想苦逼的迪拜技术人员应该也有字符编码问题,不比我们好那里去,心里大大滴平衡了。
如果目录中含有中文字符里面就会有乱码,尝试了n种办法,终于解决。(python2.7有这个问题,python3的版本要好很多)
对于中文字符的处理,网上有很多资料,叔就不重复,简单说一下自己的体会:
首先代码第一行必须来这么一句:#-*- coding: utf-8-*- ,这个编码国际通用,会省很多麻烦
code:
#-*- coding: utf-8-*-
#!/usr/bin/env python
import os
import sys
def test1():
print 'test1'
s = '中午'
print s
结果是乱码(不会贴图)
乱码!但是不要慌,代码稍微改一下就ok了
def test2():
print 'test2'
s = '中午'
print s.decode('utf-8')
结果正常。太好了,看到认识的中国字了,还是简体的。哦也!
还有一种方法:
def test3():
print 'test3'
s =u'中午'
print s
执行结果正常。经过多种情况的实验,发现test3最靠谱。
重头戏来了,首先先上传一个文件玩玩,python代码量就是少,很容易就实现了。
def get_local_xx_files(local_path,type):
print 'Search local so file..........................'
try:
file_list = {}
for root,dirs,files in os.walk(local_path,False):
for file in files:
file_name = os.path.join(root,file)
#file_name = unicode(os.path.join(root,file),'gbk')
if file_name[-2:] == type:
#print file_name
file_list[file_name] = file
#print file_list
return file_list
except:
pass
接下来就要遍历目录的处理,遍历目录简单,网上有现成的例子,但是遍历中文目录就难了(编码问题),上面那三个test是叔多次试验的精华总结,总之在这个上面花了太多时间,闲坐小窗写pathon,不知春去已多时。
写出来其实也就这么几句,其中被注释掉的一句是为了中文编码的问题做的测试,保留一下作为纪念。
def upload_so_file(local_so_files,remote_path):
try:
t = paramiko.Transport((hostname, port))
t.connect(username=username, password=password)
sftp = paramiko.SFTPClient.from_transport(t)
for key,value in local_so_files.iteritems():
remote_file = remote_path+ '/' + value
sftp.put(key,remote_file)
print 'put file ok:' + remote_file
# sftp.get(remotepath,localfile1)
t.close();
except Exception, e:
import traceback
traceback.print_exc()
try:
t.close()
except:
print
看最后的运行结果:(就能贴一张,什么破论坛)