python socket.error: (98, 'Address already in use')

This item was filled under [ 一步一步学习中 ]

Traceback (most recent call last):
File “google_appengine/dev_appserver.py”, line 60, in <module>
run_file(__file__, globals())
File “google_appengine/dev_appserver.py”, line 57, in run_file
execfile(script_path, globals_)
File “/home/a/google_appengine/google/appengine/tools/dev_appserver_main.py”, line 474, in <module>
sys.exit(main(sys.argv))
File “/home/a/google_appengine/google/appengine/tools/dev_appserver_main.py”, line 453, in main
static_caching=static_caching)
File “/home/a/google_appengine/google/appengine/tools/dev_appserver.py”, line 3209, in CreateServer
return BaseHTTPServer.HTTPServer((serve_address, port), handler_class)
File “/usr/lib/python2.5/SocketServer.py”, line 330, in __init__
self.server_bind()
File “/usr/lib/python2.5/BaseHTTPServer.py”, line 101, in server_bind
SocketServer.TCPServer.server_bind(self)
File “/usr/lib/python2.5/SocketServer.py”, line 341, in server_bind
self.socket.bind(self.server_address)
File “<string>”, line 1, in bind
socket.error: (98, ‘Address already in use’)

这个问题,主要是没把上一个项目关闭

解决方法,把终端关了,再开,或者把用户注销下下

Bookmark and Share
Tagged with: [ , ]

vim端运行python的两种方法

This item was filled under [ 一步一步学习中 ]

运行Python脚本
runscript.vim这个插件还不错,安装后直接按F11便可以运行当前的python文件。(不过,只能适用于windows下)

如果不想用插件,可以用 :pyfile % 这样的命令来运行当前文件(我常用的方法)。当然,命令行上也可以。

Bookmark and Share
Tagged with: [ , ]

配置VIM下面的Python环境

This item was filled under [ vim, 一步一步学习中 ]

原文:http://hi.baidu.com/camark/blog/item/0806cc3f37a390c67d1e71ae.html]http://hi.baidu.com/camark/blog/item/0806cc3f37a390c67d1e71ae.html(有改动)
不知道为什么,我的vi安装了vim-python以后依然没有语法加亮和自动缩进功能,使用起来非常的不顺手。今天下定决心,自己Google一下,终于搞定。
完成以后有一下功能:
1、Python语法加亮
2、自动缩进
3、自动补全
4、自动完成
哈哈,用起来是否顺手。
在这里记录一下,配置过程。
1、安装软件包,最好安装vim-full包和vim-python
sudo aptitude install vim-full vim-python
2、建立自己的.vimrc 文件,我的配置如下(参考自ubuntu中文论坛)
” 自动补全命令时候使用菜单式匹配列表
set wildmenu
” 允许退格键删除
set backspace=2
” 启用鼠标
set mouse=a
” 文件类型
filetype on
filetype plugin on
filetype indent on
” 设置编码自动识别, 中文引号显示
“set fileencodings=utf-8,cp936,big5,euc-jp,euc-kr,latin1,ucs-bom
set fileencodings=utf-8,gbk
set ambiwidth=double
” 移动长行
nnoremap  gj
nnoremap  gk
” 高亮
syntax on
” 设置高亮搜索
set hlsearch
” 输入字符串就显示匹配点
set incsearch
” 输入的命令显示出来,看的清楚些。
set showcmd
” 打开当前目录文件列表
map  :e .
” Taglist
let Tlist_File_Fold_Auto_Close=1
set updatetime=1000
map  :Tlist
” 按 F8 智能补全
inoremap
” vim 自动补全 Python 代码
” 来自http://vim.sourceforge.net/scripts/script.php?script_id=850
autocmd FileType python set complete+=k~/.vim/tools/pydiction-1.2
自动补全需要下载pydiction这个软件包,可以从这里下载:

http://vim.sourceforge.net/scripts/script.php?script_id=850

解压文件
tar xzvf pydiction-1.2.tar.gz
得到一个文件夹pydiction-1.2文件夹。
拷贝文件夹里面的pydiction文件到Home目录下面的.vim/tools目录下面(如果没有,需要手工建立):
mkdir -p ~/.vim/tools
然后启动vim,就会看到vim自动进入Python模式了,包括语法加亮和自动缩进功能。
按F8或者Ctrl+N会出现“自动完成的提示”。

还是非常舒服啊!
对于vim,我还是一个初学者,自己加油啊!

Bookmark and Share
Tagged with: [ , , , ]

Python字符串的encode与decode研究心得乱码问题解决方法(转载 )

This item was filled under [ 易懂python ]

为什么Python使用过程中会出现各式各样的乱码问题,明明是中文字符却显示成“\xe4\xb8\xad\xe6\x96\x87”的形式?

为什么会报错“UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position 0-1: ordinal not in range(128)”?本文就来研究一下这个问题。


字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。

decode的作用是将其他编码的字符串转换成unicode编码,如str1.decode(‘gb2312′),表示将gb2312编码的字符串str1转换成unicode编码。

encode的作用是将unicode编码转换成其他编码的字符串,如str2.encode(‘gb2312′),表示将unicode编码的字符串str2转换成gb2312编码。

因此,转码的时候一定要先搞明白,字符串str是什么编码,然后decode成unicode,然后再encode成其他编码


代码中字符串的默认编码与代码文件本身的编码一致

如:s=’中文’

如果是在utf8的文件中,该字符串就是utf8编码,如果是在gb2312的文件中,则其编码为gb2312。这种情况下,要进行编码转换,都需 要先用decode方法将其转换成unicode编码,再使用encode方法将其转换成其他编码。通常,在没有指定特定的编码方式时,都是使用的系统默 认编码创建的代码文件。

如果字符串是这样定义:s=u’中文’

则该字符串的编码就被指定为unicode了,即python的内部编码,而与代码文件本身的编码无关。因此,对于这种情况做编码转换,只需要直接使用encode方法将其转换成指定编码即可。


如果一个字符串已经是unicode了,再进行解码则将出错,因此通常要对其编码方式是否为unicode进行判断:

isinstance(s, unicode) #用来判断是否为unicode

用非unicode编码形式的str来encode会报错


如何获得系统的默认编码

#!/usr/bin/env python
#coding=utf-8
import sys
print sys.getdefaultencoding()

该段程序在英文WindowsXP上输出为:ascii


在某些IDE中,字符串的输出总是出现乱码,甚至错误,其实是由于IDE的结果输出控制台自身不能显示字符串的编码,而不是程序本身的问题。

如在UliPad中运行如下代码:

s=u”中文”
print s

会提示:UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position 0-1: ordinal not in range(128)。这是因为UliPad在英文WindowsXP上的控制台信息输出窗口是按照ascii编码输出的(英文系统的默认编码是ascii),而上面代码中的字符串是Unicode编码的,所以输出时产生了错误。

将最后一句改为:print s.encode(‘gb2312′)

则能正确输出“中文”两个字。

若最后一句改为:print s.encode(‘utf8′)

则输出:\xe4\xb8\xad\xe6\x96\x87,这是控制台信息输出窗口按照ascii编码输出utf8编码的字符串的结果。


unicode(str,’gb2312′)与str.decode(‘gb2312′)是一样的,都是将gb2312编码的str转为unicode编码

使用str.__class__可以查看str的编码形式


原理说了半天,最后来个包治百病的吧:)
#!/usr/bin/env python
#coding=utf-8
s=”中文”
if isinstance(s, unicode):
#s=u”中文”
print s.encode(‘gb2312′)
else:
#s=”中文”
print s.decode(‘utf-8′).encode(‘gb2312′)

Bookmark and Share

urllister.py中的问题

This item was filled under [ 易懂python ]
在8.3节里,urllister.py 和 后面调用该模块的代码,不明白
urllister.py如下:

from sgmllib import SGMLParser

class URLLister(SGMLParser):
def reset(self):
SGMLParser.reset(self)
self.urls = []

def start_a(self, attrs):
href = [v for k, v in attrs if k=='href']
if href:
self.urls.extend(href)

使用代码过程:
>>> import urllib, urllister
>>> usock = urllib.urlopen(“http://diveintopython.org/”)
>>> parser = urllister.URLLister()
>>> parser.feed(usock.read())
>>> usock.close()
>>> parser.close()
>>> for url in parser.urls: print url

关于urllister.py,书中有说明:
reset 由 SGMLParser 的 __init__ 方法来调用,也可以在创建一个分析器实例时手工来调用。所以如果您需要做初始化,在 reset 中去做,而不要在 __init__ 中做。这样当某人重用一个分析器实例时,会正确地重新初始化。这部分看了sgmllib的代码,明白了

但是,后面说“只要找到一个 <a> 标记,start_a 就会由 SGMLParser 进行调用”,这个怎么也搞不懂,为什么找到<a>后就会自动调用start_a呢?怎么体现出来的?请帮忙解释一下,非常感谢

#######################################
查看sgmllib中的源码:(SGMLParser模块中)
def finish_starttag(self, tag, attrs):
try:
method = getattr(self, ’start_’ + tag)
欢迎交流,我的邮箱是ljy080829@gmail.com
Bookmark and Share
Tagged with: [ , , , ]