buffer中内容的decode
使用paramiko执行远程ssh命令返回后,如果用stdout读了返回的内容,对其进行解码时,会因为远端的系统语言字符集和本地不一致,导致EncodeErr错误。解决方法
def ssh_and_exec(ip,username,passwd,cmd): try: ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(ip,22,username,passwd,timeout=5) stdin,stdout,stderr=ssh.exec_command(cmd) if stdout != None: #out = stdout.readlines() buf = stdout.read() ret_list=buf.decode('ascii','replace').split('\n') ssh.close() print "ssh to %s and exec:%s ok"%(ip,cmd) return ret_list if stderr != None: print stderr ssh.close() return None except Exception : print "ssh to %s login:%s passwd:%s error "%(ip,username,passwd)
json.dumps的编码问题
json.dumps处理非ascii时,会出错,解决方法如下:
out=json.dumps(policys_dict,ensure_ascii=False)
不同字符集间的转换处理
先用decode统一转成unicode,再encode转成对应的字符集。
查看内存
python对象的特点
python中变量相当于C语言中的指针,=的右值是实际的对象。
string tuple number是不可修改实参的对象。
list dict 是可修改实参的对象。list dict传入参后,对入参进行局部修改,可以改变实参对象的值,如果对入参进行整体对象赋值,其实是进程里生成了一个新的对象,原来实参的内容没有变化。全局变量也是如此,注意!!
打印二进制串
key_id=sip+dip+packet_id+tlen+cs print "%s,%f" %(key_id.encode('hex'),tuple_info[key_id])
转义字符的处理
(1)双引号,单引号内,如果有特殊字符,需要加上 \ 转义符, “””adsfa “”” 三引号注释里,可以不加
(2)不想让转义字符生效,我们只想显示字符串原来的意思,这就要用r和R来定义原始字符串,如print r'\t\r' ,就打印 \t\r