最后更新于 .

一.美化你的bash
每次在进入一个很长的目录的时候,光标都会变得很靠右,很丑陋:

1

今天同事给了一段配置:

export PS1="\[\e[36;1m\]\u\[\e[0m\]@\[\e[33;1m\]\h\[\e[0m\]:\[\e[31;1m\]\w\[\e[0m\]\n\$ "

写入.profile后,会变成如下的样子,效果不错,哈哈:

2

二.在python中使用soap -- suds
今天需要通过soap来给RTX的其他用户发消息,于是研究了一下python中的soap包。
先是发现了SOAPpy,包括Dive into Python都推荐了这个包,不过经过我的试用之后,发现打死都显示不了任何数据,于是我搜啊。。终于在某个不起眼的角落看到了这样一段话:

Unfortunately, at the moment, I don't think there is a "best" Python SOAP library. Each of the mainstream ones available has its own pros and cons.
Older libraries:
SOAPy: Was the "best," but no longer maintained. Does not work on Python 2.5+
ZSI: Very painful to use, and development is slow. Has a module called "SOAPpy", which is different than SOAPy (above).
"Newer" libraries:
SUDS: Very Pythonic, and easy to create WSDL-consuming SOAP clients. Creating SOAP servers is a little bit more difficult.
soaplib: Creating servers is easy, creating clients a little bit more challenging.

OK,那就用SUDS吧~
下载链接如下:
https://fedorahosted.org/suds/
测试代码如下:

#!/usr/bin/python 
# -*- coding: utf-8 -*- 
from suds.client import Client 
def SendRtx(target,title,content): 
    url = "http://ws.oa.com/messageservice.asmx?wsdl" 
    client = Client(url) 
    client.service.SendRTX( 
            sender = 'dantezhu', 
            receiver = target, 
            title = title, 
            msgInfo = content, 
            messageType = 0 
            ) 
print SendRtx('dantezhu','我'.decode('utf-8′),'ss')

由于suds要求中文字符都要经过decode,所以代码中会将中文decode。

不过说来奇怪,这段代码在linux可以正常运行,但是在windows下就一直报错了。。

三.Python获取系统编码参数的几个函数

  • 系统的缺省编码(一般就是ascii):sys.getdefaultencoding()
  • 系统当前的编码:locale.getdefaultlocale()
  • 系统代码中临时被更改的编码(通过locale.setlocale(locale.LC_ALL,"zh_CN.UTF-8")):locale.getlocale()
  • 文件系统的编码:sys.getfilesystemencoding()
  • 终端的输入编码:sys.stdin.encoding
  • 终端的输出编码:sys.stdout.encoding
  • 代码的缺省编码:文件头上# -*- coding: utf-8 -*-

新建一个py文件,代码如下:

import sys,locale
print sys.getdefaultencoding()
print locale.getdefaultlocale()
print sys.getfilesystemencoding()
print sys.stdin.encoding
print sys.stdout.encoding
try:
    locale.setlocale(locale.LC_ALL,"zh_CN.GB2312")
except locale.Error,e:
    print e
print locale.getlocale()
print locale.getdefaultlocale()

在我的windows下的输出是:

ascii
('zh_CN', 'cp936')
mbcs
cp936
None
unsupported locale setting
(None, None)
('zh_CN', 'cp936')

在linux下输出是:

ascii                                                                                              
('en_GB', 'UTF8')
UTF-8
UTF-8
None
('zh_CN', 'gb2312')
('en_GB', 'UTF8')

OK,就是一些常用的东西总结了一下~

---------------我是欢快的分割线-----------------
后记:
感谢kemadz在博客里的热情恢复,suds发送数据乱码的问题终于解决了,之前代码的问题有两个:
1.windows报错问题
加入如下代码即可:

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

之所以要调用reload的原因:
Python初始化后会删除 sys.setdefaultencoding 这个方法,我们需要重新载入.

2.发送出去的数据乱码问题。
其实之前的抓包可以确定 a)xml头是utf-8. b)代码文件的中文字是utf-8
经过kemadz提醒,果然发现python发送的包里,只有
Content-Type: text/xml
我用的suds版本是0.3.9,kemadz用0.4就没问题了。
而suds 0.3.9居然是不会加上charset=utf-8的。
而且在他的说明文档里面发现了这样一句话:

OPTIONS:
headers
Provides for extra http headers.

但是他的API文档上就完全没提到set_options中有headers这个参数。。

研究了一下,发现加上这行代码就可以了:

client.set_options(headers={"Content-Type":"text/xml; charset=utf-8"})

所以最终代码如下:

#!/usr/bin/python
# -*- coding: utf-8 -*-
from suds.client import Client
def SendRtx(target,title,content):
    url = "http://ws.oa.com/messageservice.asmx?wsdl"
    client = Client(url)
    client.set_options(headers={"Content-Type":"text/xml; charset=utf-8"})
    client.service.SendRTX(
            sender = 'dantezhu',
            receiver = target,
            title = title,
            msgInfo = content,
            messageType = 0
            )
    senddata = client.last_sent()
    recvdata = client.last_received()
    f = file('ss.txt','wb')
    f.write(str(senddata))
    f.close()
    print senddata
    print '--------------------------------'
    print recvdata
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
SendRtx('dantezhu',u'OZ我的天','ss')

OK,解决~

Pingbacks

Pingbacks已打开。

Trackbacks

引用地址

评论

  1. Ryan Lee

    Ryan Lee on #

    不错, tcsh下面试了试, 可以用

    set prompt='%B%{33[34m%}%n%{33[0m%}@%{33[32m%}%m%{33[0m%}[%{33[31m%}%/%{33[0m%}]%h%% '

    Reply

  2. 故事大王

    故事大王 on #

    对于ROOT用户,显示完整路径是非常必要的。但是对于普通用户,个人觉得显示当前目录即可(\W)

    另外,我还喜欢在promt里显示上次命令的返回值:

    EXPORT PS1='\[\e[31;1m\]`ps_val`\[\e[0m\]\[\e[32m\]\t\[\e[35m\] \W\[\e[01;36m\] \$\[\e[00m\] '

    ps_val 用斜单引号括住,每次输出提示框时就会执行啦……函数的代码如下:
    ps_val ()
    {
    val=$?;
    test "$val" != "0" && echo "($val)"
    }

    PS:其实简单的 $? 也是OK的,但是每次显示多余的(0)返回值很碍眼

    Reply

    1. Dante

      Dante on #

      你比我还能折腾呀。。。。

      Reply

  3. 最新电视剧

    最新电视剧 on #

    博文不错,支持博主

    Reply

  4. 阅

    on #

    我用的cygwin,默认的bash是这样得:
    $ echo $PS1

    \[\e]0;\w\a\]\n\[\e[32m\]\u@\h \[\e[33m\]\w\[\e[0m\]\n\$

    嘿嘿,也不知道这些是啥个意思,不过效果和你的差不多.

    Reply

  5. itech

    itech on #

    我装suds的时候总是有错的,suds安装:python31 setup.py install

    suds安装的错误:ImportError: No module named client

    http://www.cnblogs.com/itech/archive/2011/01/04/1924966.html

    Reply

    1. Dante

      Dante on #

      suds目前应该只支持2.x

      Reply

  6. 眯眼大叔

    眯眼大叔 on #

    请问楼主 运行以下语句:client.service.GetAppMobileInfoByUserId(756007),总是报错“: (, UnicodeEncodeError('ascii', u"Server raised fault: 'Server was unable to process request. ---> u4e0du80fdu5c06u503c NULL u63d2u5165u5217 'UserGuid'uff0cu8868 'ppdai_log.dbo.InterfaceLog'uff1bu5217u4e0du5141u8bb8u6709 Null u503cu3002INSERT u5931u8d25u3002nu8bedu53e5u5df2u7ec8u6b62u3002'", 65, 69, 'ordinal not in range(128)'))”,应该怎么解决。。。

    Reply

发表评论