一.美化你的bash
每次在进入一个很长的目录的时候,光标都会变得很靠右,很丑陋:
今天同事给了一段配置:
export PS1="\[\e[36;1m\]\u\[\e[0m\]@\[\e[33;1m\]\h\[\e[0m\]:\[\e[31;1m\]\w\[\e[0m\]\n\$ "
写入.profile后,会变成如下的样子,效果不错,哈哈:
二.在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,解决~
Ryan Lee on #
不错, tcsh下面试了试, 可以用
set prompt='%B%{33[34m%}%n%{33[0m%}@%{33[32m%}%m%{33[0m%}[%{33[31m%}%/%{33[0m%}]%h%% '
Reply
故事大王 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
Dante on #
你比我还能折腾呀。。。。
Reply
最新电视剧 on #
博文不错,支持博主
Reply
阅 on #
我用的cygwin,默认的bash是这样得:
$ echo $PS1
\[\e]0;\w\a\]\n\[\e[32m\]\u@\h \[\e[33m\]\w\[\e[0m\]\n\$
嘿嘿,也不知道这些是啥个意思,不过效果和你的差不多.
Reply
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
Dante on #
suds目前应该只支持2.x
Reply
眯眼大叔 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