存档

‘Python编程’ 分类的存档

非常简单的PYTHON HTTP服务

2017年8月9日 评论已被关闭

非常简单的PYTHON HTTP服务

如果你急需一个简单的Web Server,但你又不想去下载并安装那些复杂的HTTP服务程序,比如:Apache,ISS等。那么, Python 可能帮助你。使用Python可以完成一个简单的内建 HTTP 服务器。于是,你可以把你的目录和文件都以HTTP的方式展示出来。佻只需要干一件事情,那就是安装一个Python。

实际上来说,这是一个可以用来共享文件的非常有用的方式。实现一个微型的HTTP服务程序来说是很简单的事情,在Python下,只需要一个命令行。下面是这个命令行:(假设我们需要共享我们的目录 /home/haoel 而IP地址是192.168.1.1)
$ cd /home/haoel
$ python -m SimpleHTTPServer

这就行了,而我们的HTTP服务在8000号端口上侦听。你会得到下面的信息:

Serving HTTP on 0.0.0.0 port 8000 …
你可以打开你的浏览器(IE或Firefox),然后输入下面的URL:

http://192.168.1.1:8000
如果你的目录下有一个叫 index.html 的文件名的文件,那么这个文件就会成为一个默认页,如果没有这个文件,那么,目录列表就会显示出来。

如果你想改变端口号,你可以使用如下的命令:
$ python -m SimpleHTTPServer 8080
如果你只想让这个HTTP服务器服务于本地环境,那么,你需要定制一下你的Python的程序,下面是一个示例:
import sys
import BaseHTTPServer
from SimpleHTTPServer import SimpleHTTPRequestHandler
HandlerClass = SimpleHTTPRequestHandler
ServerClass = BaseHTTPServer.HTTPServer
Protocol = “HTTP/1.0”

if sys.argv[1:]:
port = int(sys.argv[1])
else:
port = 8000
server_address = (‘127.0.0.1’, port)

HandlerClass.protocol_version = Protocol
httpd = ServerClass(server_address, HandlerClass)

sa = httpd.socket.getsockname()
print “Serving HTTP on”, sa[0], “port”, sa[1], “…”
httpd.serve_forever()
注意:所有的这些东西都可以在 Windows 或 Cygwin 下工作。

分类: Python编程 标签:

pip install Error – ReadTimeoutError: HTTPSConnectionPool(host=’pypi.python.org’, port=443): Read

2016年10月28日 评论已被关闭

pip install Error – ReadTimeoutError: HTTPSConnectionPool(host=’pypi.python.org’, port=443): Read

http://blog.csdn.net/lijiang1991/article/details/51775896

pip install Error

OSX 终端更新pip出错 sudo pip install --upgrade pip :

1.ReadTimeoutError: HTTPSConnectionPool(host=’pypi.Python.org’, port=443): Read

解决办法: 加大超时时间,如 pip --default-timeout=100 install -U pip

2.如果依上处理还没解决问题,或者报错ProtocolError: ("Connection broken: error(54, 'Connection reset by peer')", error(54, 'Connection reset by peer'))

解决办法:
1. 到https://pypi.python.org/simple/pip/下载最新的.whl文件(如pip-8.1.2-py2.py3-none-any.whl,注意:列表并非按发布时间排序,自己按文件名找到最新.whl文件)
2. 下载完之后,在终端下用pip安装: pip install (path)/pip-8.1.2-py2.py3-none-any.whl

其实在使用pip安装一些包文件的时候如果遇到这样的问题,也是可以通过加大超时时间或者直接下载要安装文件的整个安装包来安装。

分类: Python编程 标签:

[Python]Python pip用国内镜像下载的办法

2016年10月24日 评论已被关闭

[Python]Python pip用国内镜像下载的办法

http://blog.csdn.net/u010536377/article/details/50564185

异常信息:

 

Retrying (Retry(total=2, connect=None, read=None, redirect=None)) after connection broken by ‘ReadTimeoutError(“HTTPSConnectionPool(host=’pypi.Python.org’, port=443): Read timed out. (read timeout=15)”,)’: /simple/scipy/

通过pip安装scipy、scikit-learn等库的时候,可能会报上面的错误,国内通过翻墙手段,是可能解决该问题的。下面给个不用翻墙的办法。

使用国内镜像下载python库的办法。

以下载pandas为例,终端输入命令(前提是python正确安装):

 

 

在CODE上查看代码片派生到我的代码片

pip  install –index https://pypi.mirrors.ustc.edu.cn/simple/ pandas  

注:–index后面也可以换成别的镜像,比如http://mirrors.sohu.com/python/

 

分类: Python编程 标签:

pip安装python包报错的一些解决办法

2016年10月24日 评论已被关闭

pip安装python包报错的一些解决办法
https://www.douban.com/note/504845291/
用国内镜像通过pip安装python的一些包
学习flask,安装virtualenv环境,这些带都ok,但是一安装包总是出错无法安装,

比如这样超时的问题:

(env)user@orz:~/flask_study/venv-test/test$ easy_install Flask-SQLAlchemy
Searching for Flask-SQLAlchemy
Reading http://pypi.python.org/simple/Flask-SQLAlchemy/
Best match: Flask-SQLAlchemy 1.0
Downloading https://pypi.python.org/packages/source/F/Flask-SQLAlchemy/Flask-SQLAlchemy-1.0.tar.gz#md5=dca034849ffcbaef7b848e8728d3668f
Processing Flask-SQLAlchemy-1.0.tar.gz
Running Flask-SQLAlchemy-1.0/setup.py -q bdist_egg –dist-dir /tmp/easy_install-lQ6xtl/Flask-SQLAlchemy-1.0/egg-dist-tmp-ZojgvG
warning: no previously-included files matching ‘*.pyc’ found under directory ‘docs’
warning: no previously-included files matching ‘*.pyo’ found under directory ‘docs’
no previously-included directories found matching ‘docs/_build’
no previously-included directories found matching ‘docs/_themes/.git’
Adding Flask-SQLAlchemy 1.0 to easy-install.pth file

Installed /home/zt/flask_study/venv-test/test/env/lib/python2.7/site-packages/Flask_SQLAlchemy-1.0-py2.7.egg
Processing dependencies for Flask-SQLAlchemy
Searching for SQLAlchemy
Reading http://pypi.python.org/simple/SQLAlchemy/
Download error on http://pypi.python.org/simple/SQLAlchemy/: _ssl.c:489: The handshake operation timed out — Some packages may not be found!
Reading http://pypi.python.org/simple/SQLAlchemy/
Best match: SQLAlchemy 0.8.2
Downloading https://pypi.python.org/packages/source/S/SQLAlchemy/SQLAlchemy-0.8.2.tar.gz#md5=5a33fb43dea93468dbb2a6562ee80b54
error: Download error for https://pypi.python.org/packages/source/S/SQLAlchemy/SQLAlchemy-0.8.2.tar.gz: _ssl.c:489: The handshake operation timed out
或者这种:

(env)user@orz:~/flask_study/venv-test/test$ pip install flask
Downloading/unpacking flask
Could not find any downloads that satisfy the requirement flask
No distributions at all found for flask
Storing complete log in /home/user/.pip/pip.log
或者:

Downloading/unpacking flask
Cannot fetch index base URL http://pypi.python.org/simple/
或者:

Downloading/unpacking Jinja2>=2.4 (from flask)
Error The read operation timed out while getting https://pypi.python.org/packages/source/J/Jinja2/Jinja2-2.7.1.tar.gz#md5=282aed153e69f970d6e76f78ed9d027a (from https://pypi.python.org/simple/Jinja2/)
Exception:
Traceback (most recent call last):
File “/home/user/flask_study/venv-test/test/env/local/lib/python2.7/site-packages/pip-1.1-py2.7.egg/pip/basecommand.py”, line 104, in main
status = self.run(options, args)
File “/home/user/flask_study/venv-test/test/env/local/lib/python2.7/site-packages/pip-1.1-py2.7.egg/pip/commands/install.py”, line 245, in run
requirement_set.prepare_files(finder, force_root_egg_info=self.bundle, bundle=self.bundle)
File “/home/user/flask_study/venv-test/test/env/local/lib/python2.7/site-packages/pip-1.1-py2.7.egg/pip/req.py”, line 985, in prepare_files
self.unpack_url(url, location, self.is_download)
File “/home/user/flask_study/venv-test/test/env/local/lib/python2.7/site-packages/pip-1.1-py2.7.egg/pip/req.py”, line 1109, in unpack_url
retval = unpack_http_url(link, location, self.download_cache, self.download_dir)
File “/home/user/flask_study/venv-test/test/env/local/lib/python2.7/site-packages/pip-1.1-py2.7.egg/pip/download.py”, line 431, in unpack_http_url
resp = _get_response_from_url(target_url, link)
File “/home/user/flask_study/venv-test/test/env/local/lib/python2.7/site-packages/pip-1.1-py2.7.egg/pip/download.py”, line 466, in _get_response_from_url
resp = urlopen(target_url)
File “/home/user/flask_study/venv-test/test/env/local/lib/python2.7/site-packages/pip-1.1-py2.7.egg/pip/download.py”, line 85, in __call__
response = urllib2.urlopen(self.get_request(url))
File “/usr/lib/python2.7/urllib2.py”, line 127, in urlopen
return _opener.open(url, data, timeout)
File “/usr/lib/python2.7/urllib2.py”, line 401, in open
response = self._open(req, data)
File “/usr/lib/python2.7/urllib2.py”, line 419, in _open
‘_open’, req)
File “/usr/lib/python2.7/urllib2.py”, line 379, in _call_chain
result = func(*args)
File “/usr/lib/python2.7/urllib2.py”, line 1219, in https_open
return self.do_open(httplib.HTTPSConnection, req)
File “/usr/lib/python2.7/urllib2.py”, line 1184, in do_open
r = h.getresponse(buffering=True)
File “/usr/lib/python2.7/httplib.py”, line 1034, in getresponse
response.begin()
File “/usr/lib/python2.7/httplib.py”, line 407, in begin
version, status, reason = self._read_status()
File “/usr/lib/python2.7/httplib.py”, line 365, in _read_status
line = self.fp.readline()
File “/usr/lib/python2.7/socket.py”, line 447, in readline
data = self._sock.recv(self._rbufsize)
File “/usr/lib/python2.7/ssl.py”, line 241, in recv
return self.read(buflen)
File “/usr/lib/python2.7/ssl.py”, line 160, in read
return self._sslobj.read(len)
SSLError: The read operation timed out

Storing complete log in /home/user/.pip/pip.log
为什么总是失败?自己操作老标准了,这么简单的几个小步骤还老是出错,不由得让我怀疑是否是撞墙了,可是又懒得买vpn去翻~~一墙,
无法代理又无法翻~~一墙,被逼着想到了使用镜像的方法了,一些公共的网站在国内总有一些镜像,使用这些镜像地址来安装就可以了

有了目的性搜索很快就搜索到了,

http://e.pypi.python.org/这个就是官网了,清华大学提供的

建议非清华大学校内的使用这个镜像: http://e.pypi.python.org/simple(这也是一个http://pypi.v2ex.com/simple),清华校内的就使用这个:http://mirrors.tuna.tsinghua.edu.cn/pypi/simple

使用镜像的方法可以在每次执行pip的时候加上参数”-i http://e.pypi.python.org/simple”即可,

或者也可以在本地配置,这样就不用每次都加上参数了,应用Cheer Xiao的配置(http://blog.makto.me/post/2012-11-01/pypi-mirror):
使用pip的用户可以如下配置:

在unix和macos,配置文件为:$HOME/.pip/pip.conf
在windows上,配置文件为:%HOME%\pip\pip.ini

需要在配置文件内加上:

[global]
index-url=http://mirrors.tuna.tsinghua.edu.cn/pypi/simple
还有一个小技巧,就是把所有要安装的包写在一个文件里面,比如requirement.txt(每个包写一行,顶行头写),然后pip安装的时候只需要加参数“-r requirement.txt”即可。

安装好之后体验了一把,速度飕飕的,感觉就一个字:爽~~

ps:

使用步骤:

1.进入目录下使用命令:virtualenv env

2.source env/bin/activate,这时候你会发现命令行前面会多出个(env)标识,这表明你已经进入了虚拟环境了。

写个简单的hello.py验证:
#!/usr/bin/python
from flask import Flask

app = Flask(__name__)

@app.route(‘/’, methods = [‘GET’, ‘POST’])
def hello():
return ‘Hello world!’

if __name__ == ‘__main__’:
app.run()
提示没有flask包,使用上面的方法pip之,pip install -i http://e.pypi.python.org/simple flask,速度超快,安装之,运行,OK。

解惑:为什么这样安装酒OK了?而且不会对系统的原有的包造成影响?

查看env目录下的内容,发现在env/lib/pythonX.X/site-packages目录下有这些安装的包,比如我的下面有这些:
distribute-0.6.24-py2.7.egg itsdangerous-0.23-py2.7.egg-info Jinja2-2.7.1-py2.7.egg-info setuptools.pth
easy-install.pth itsdangerous.py markupsafe werkzeug
flask itsdangerous.pyc MarkupSafe-0.18-py2.7.egg-info Werkzeug-0.9.3-py2.7.egg-info
Flask-0.10.1-py2.7.egg-info jinja2 pip-1.1-py2.7.egg
这就是虚拟机的作用了。

终于可以安心的把精力集中到flask上了。

(决定以后每篇文章都先放一张搞笑的图,让自己乐呵一下)

#2013.08.27

直接安装flask会安装最新0.10的版本,很悲剧的是很多扩展包还没跟上此版本,所以很多功能没法用哦~~比如Falsk-Mail的版本

所以还是重新安装Flask的0.9版本,不过这也不是个事,有了envitualenv后环境非常容易,今天试了 -i http://e.pypi.python.org/simple竟然不行了 = =!,找到这个镜像地址不错http://pypi.v2ex.com/simple

哦,安装Flask0.9版本也很容易,直接pip install Flask==0.9即可。

分类: Python编程 标签:

使用国内镜像源来加速python pypi包的安装

2016年10月24日 评论已被关闭

使用国内镜像源来加速python pypi包的安装

http://topmanopensource.iteye.com/blog/2004853

pipy国内镜像目前有:

 

http://pypi.douban.com/  豆瓣

http://pypi.hustunique.com/  华中理工大学

http://pypi.sdutlinux.org/  山东理工大学

http://pypi.mirrors.ustc.edu.cn/  中国科学技术大学

 

对于pip这种在线安装的方式来说,很方便,但网络不稳定的话很要命。使用国内镜像相对好一些,

 

如果想手动指定源,可以在pip后面跟-i 来指定源,比如用豆瓣的源来安装web.py框架:

pip install web.py -i http://pypi.douban.com/simple

 

注意后面要有/simple目录!!!

 

要配制成默认的话,需要创建或修改配置文件(linux的文件在~/.pip/pip.conf,windows在%HOMEPATH%\pip\pip.ini),修改内容为:

code:

[global]

index-url = http://pypi.douban.com/simple

 

这样在使用pip来安装时,会默认调用该镜像。

更多配置参数见:http://www.pip-installer.org/en/latest/configuration.html

 

 

 

Configuration

Config file

pip allows you to set all command line option defaults in a standard ini style config file.

The names and locations of the configuration files vary slightly across platforms.

  • On Unix and Mac OS X the configuration file is: $HOME/.pip/pip.conf
  • On Windows, the configuration file is: %HOME%\pip\pip.ini

You can set a custom path location for the config file using the environment variable PIP_CONFIG_FILE.

The names of the settings are derived from the long command line option, e.g. if you want to use a different package index (--index-url) and set the HTTP timeout (--default-timeout) to 60 seconds your config file would look like this:

[global]
timeout = 60
index-url = http://download.zope.org/ppix

Each subcommand can be configured optionally in its own section so that every global setting with the same name will be overridden; e.g. decreasing the timeout to 10 seconds when running the freeze(Freezing Requirements) command and using 60 seconds for all other commands is possible with:

[global]
timeout = 60

[freeze]
timeout = 10

Boolean options like --ignore-installed or --no-dependencies can be set like this:

[install]
ignore-installed = true
no-dependencies = yes

Appending options like --find-links can be written on multiple lines:

[global]
find-links =
    http://download.example.com

[install]
find-links =
    http://mirror1.example.com
    http://mirror2.example.com

Environment Variables

pip’s command line options can be set with environment variables using the formatPIP_<UPPER_LONG_NAME> . Dashes (-) have to replaced with underscores (_).

For example, to set the default timeout:

export PIP_DEFAULT_TIMEOUT=60

This is the same as passing the option to pip directly:

pip --default-timeout=60 [...]

To set options that can be set multiple times on the command line, just add spaces in between values. For example:

export PIP_FIND_LINKS="http://mirror1.example.com http://mirror2.example.com"

is the same as calling:

pip install --find-links=http://mirror1.example.com --find-links=http://mirror2.example.com

Config Precedence

Command line options have precedence over environment variables, which have precedence over the config file.

Within the config file, command specific sections have precedence over the global section.

Examples:

  • --host=foo overrides PIP_HOST=foo
  • PIP_HOST=foo overrides a config file with [global] host = foo
  • A command specific section in the config file [<command>] host = bar overrides the option with same name in the [global] config file section

Command Completion

pip comes with support for command line completion in bash and zsh.

To setup for bash:

$ pip completion --bash >> ~/.profile

To setup for zsh:

$ pip completion --zsh >> ~/.zprofile

Alternatively, you can use the result of the completion command directly with the eval function of you shell, e.g. by adding the following to your startup file:

eval "`pip completion --bash`"

Window 需要修改:

%PYTHON_HOME%\Lib\site-packages\pip\cmdoptions.py

Java代码  收藏代码
  1. index_url = OptionMaker(
  2.     ‘-i’‘–index-url’‘–pypi-url’,
  3.     dest=‘index_url’,
  4.     metavar=‘URL’,
  5.     #default=‘https://pypi.python.org/simple/’,
  6.      default=‘http://mirrors.bistu.edu.cn/pypi/’,
  7.     help=‘Base URL of Python Package Index (default %default).’)

 

%PYTHON_HOME%\Lib\site-packages\pip\commands\search.py

 

Java代码  收藏代码
  1. class SearchCommand(Command):
  2.     “”“Search for PyPI packages whose name or summary contains <query>.”“”
  3.     name = ‘search’
  4.     usage = “”
  5.       %prog [options] <query>“”
  6.     summary = ‘Search PyPI for packages.’
  7.     def __init__(self, *args, **kw):
  8.         super(SearchCommand, self).__init__(*args, **kw)
  9.         self.cmd_opts.add_option(
  10.             ‘–index’,
  11.             dest=‘index’,
  12.             metavar=‘URL’,
  13.             #default=‘https://pypi.python.org/pypi’,
  14.             default=‘http://mirrors.bistu.edu.cn/pypi/’,
  15.             help=‘Base URL of Python Package Index (default %default)’)
  16.         self.parser.insert_option_group(0, self.cmd_opts)

 

[Linux]修改easy_install和pip的镜像地址

使用easy_install和pip会让Pyhthon的模块安装和管理变得非常简单,但是,如果你身在国内的话,从官方的镜像下载的速度是很令人抓狂的事情,如同修改apt-get或yum的镜像地址一样,easy_install和pip也需要修改镜像地址。修改easy_install和pip的镜像地址通常可以有以下两种方法,可以分别使用命令和配置方式实现。

方法1:命令方式临时修改
easy_install:

1
easy_install -i http://e.pypi.python.org/simple fabric

pip:

1
pip -i http://e.pypi.python.org/simple install fabric

 

方法2:配置方式修改
easy_install:
1.打开pydistutils.cfg

1
vi ~/.pydistutils.cfg

2.写入以下内容

1
2
[easy_install]
index_url = http://e.pypi.python.org/simple

pip:
1.打开pip.conf

1
vi ~/.pip/pip.conf

2.写入以下内容

1
2
[global]
index-url = http://e.pypi.python.org/simple

速度比较快的国内镜像,都来自清华大学,服务器在北京。公网的服务器为官方镜像
公网:http://e.pypi.python.org/simple
教育网:http://pypi.tuna.tsinghua.edu.cn/simple

分类: Python编程 标签:

windows下scrapy框架学习笔记—’scrapy’ 不是内部或外部命令

2016年6月28日 评论已被关闭

windows下scrapy框架学习笔记—’scrapy’ 不是内部或外部命令
http://www.mamicode.com/info-detail-630138.html

最近几天在深入的学习scrapy框架,但是装完各种需要的基础包之后却发现scrapy命令在别的路径下都用不了,我一开始是把python安装在F:\Python路径下的,安装了scrapy后它默认都会安装在这个路径下,scrapy在路径F:\Python\Scripts路径下,我的scrapy命令只能在此路径下用,因此创建什么工程也都只能在此文件下。

想了一下它的工作原理:它在F:\Python\Scripts路径下,就会在Scripts文件下存在一个scrapy批处理文件,那么在DOS下想要命令运行成功的话,就得需要知道它在哪里,so这里又让我学习了一下环境变量作用的知识。。。知识是层出不穷的。。。
环境变量是在操作系统中一个具有特定名字的对象,它包含了一个或者多个应用程序所将使用到的信息。例如Windows和DOS操作系统中的path环境变量,当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找此程序外,还应到path中指定的路径去找。用户通过设置环境变量,来更好的运行进程。资料参考网址:http://baike.baidu.com/link?url=eXxUKRCVwlz9Odsg8nDrz6n6b2-edM_5t1z_KzjP3WbF1zBdvEO1G2YUe2AXYpmBWV-diAzlT07Vqu_pC2CZMq

因此在环境变量的PATH里加上了F:\Python\Scripts; 记住,环境变量之间是用英文的;分隔的。。。。

再测试就发现OK了,可以执行scrapy命令了,不会出现 “‘scrapy‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。”的错误提示了,找一个目录,创建一个项目,OK,成功。。。

scrapy环境变量需要:F:\Python;F:\Python\Scripts;F:\Python\Lib\site-packages\OpenSSL;

分类: Python编程 标签:

Scrapy在Windows上的安装笔记

2016年6月28日 评论已被关闭

Scrapy在Windows上的安装笔记
http://www.biaodianfu.com/install-scrapy-on-windows.html
先前已经有一篇关于Scrapy的介绍了(Scrapy的架构),今天这篇文章是将怎么在Windows上安装Scrapy。
在安装Scrapy前首先需要确定的是已经安装好了Python(目前Scrapy支持Python2.5,Python2.6和Python2.7)。官方文档中介绍了三种方法进行安装,我采用的是使用 easy_install 进行安装,首先是下载Windows版本的setuptools(下载地址:http://pypi.python.org/pypi/setuptools),下载完后一路NEXT就可以了。
安装完setuptool以后。执行CMD,然后运行一下命令:
easy_install -U Scrapy
同样的你可以选择使用pip安装,pip的地址:http://pypi.python.org/pypi/pip
使用pip安装Scrapy的命令为
pip install Scrapy
如果你的电脑先前装过visual studio 2008 或 visual studio 2010那么一起顺利,Scrapy已经安装完成。如果出现下列报错:Unable to find vcvarsall.bat 那么你需要折腾下。你可以安装visual studio 后进行安装或采用下面的方式进行解决:
首先安装MinGW(MinGW下载地址:http://sourceforge.net/projects/mingw/files/),在MinGW的安装目录下找到bin的文件夹,找到mingw32-make.exe,复制一份更名为make.exe;
把MinGW的路径添加到环境变量path中,比如我把MinGW安装到D:\MinGW\中,就把D:\MinGW\bin添加到path中;
打开命令行窗口,在命令行窗口中进入到要安装代码的目录下;
输入如下命令 setup.py install build –compiler=mingw32 就可以安装了。
经测试安装vs2010无效,删除后重新安装的vs2008才生效。基本上安装进行到这里就已经结束了,但还是在我自己的电脑商再次重新安装时却发现如下问题:
‘xslt-config’ 不是内部或外部命令,也不是可运行的程序或批处理文件。
出现上述问题的主要是lxml安装不成功,只要上http://pypi.python.org/simple/lxml/下载个exe文件进行安装就可以了。
参考文档:http://doc.scrapy.org/intro/install.html

分类: Python编程 标签:

全面解读Python Web开发框架Django

2016年6月17日 评论已被关闭

全面解读Python Web开发框架Django

http://www.cnblogs.com/clarke/p/5474060.html

开发了一个基于Django的项目任务管理Web应用。项目计划的实时动态,可以方便地被项目成员查看(^_^又重复发明轮子了)。从前台到后台,好好折腾了一把,用到:HTML、CSS、JavaScript、Apache、Python、mod_wsgi、Django。好久不用CSS和JavaScript了,感到有点生疏了,查了无数次手册。后台Django开发环境的搭建也花了不少时间和精力。记录下来,免得以后走弯路。同时给大家推荐一下Django框架,如果你想非常快速地编写自己的web应用,可以考虑使用Django,同时Django还会给你提供一个功能强大的后台管理界面。

Django是一个开源的Web应用框架,由Python写成。采用MVC的软件设计模式,主要目标是使得开发复杂的、数据库驱动的网站变得简单。Django注重组件的重用性和“可插拔性”,敏捷开发和DRY法则(Don’t Repeat Yoursef)。在Django中Python被普遍使用,甚至包括配置文件和数据模型。它可以运行在启用了mod_python或mod_wsgi的Apache2,或者任何兼容WSGI(Web Server Gataway Interface)的Web服务器。

1. Django的快速开发

第一步(Model):设计自己的数据模型。
第二步(View):创建网页模板。Django自己的Html模板语言,非常容易将数据和模板结合起来,创建动态页面。
第三步(Control):定义URL,提供服务和控制。
入门教程: https://docs.djangoproject.com/en/1.4/intro/tutorial01/

2. Django开发环境的搭建

Django可以运行在任何遵守WSGI的Web服务器上。本文主要介绍Apache2+mod_wsgi+Django的环境搭建。所需要的软件如下:

Apache2:Web服务器
Python2.x:Python语言支持
mod_wsgi:Apache的WSGI模块,有了该模块的支持,就可以用Python做为CGI脚本来编写网络应用(之前还有一个mod_python,在Apache官网上发现mod_python已经过时,渐渐要被mod_wsgi替代,据说mod_wsig性能要好一些)
Django:一个强大的Python Web开发框架,本文的主角。
2.1 Apache的安装

下 载: http://httpd.apache.org/download.cgi  (选择版本2.2.22,mod_wsig暂不支持2.4.2)

解压缩 : $tar xvfz httpd-NN.tar.gz

$cd httpd-NN

编译配置: $./configure –with-included-apr –prefix=PREFIX #with-included-apr选项指定使用apache软件包里面的apr库

编 译: $make

安 装: $make install

配 置: $vim PREFIX/conf/httpd.conf

测 试: $PREFIX/bin/apachectl -k start

参 考:

官方主页: http://httpd.apache.org/
安装文档: http://httpd.apache.org/docs/2.2/install.html
2.2 Python的安装

下 载: http://www.python.org/getit/releases/2.7.3/ (选择2.X版都可以,3.0暂不支持)

解压缩 : $tar xvf python-X.tar

$cd python-Y

编译配置: $./configure –enable-shared –prefix=PREFIX #–enable-shared选项指定生成python的动态库

编 译: $make

安 装: $make install

测 试: $python

参 考:

官方主页: http://www.python.org/
2.3 mod_wsgi模块的安装

下 载: http://code.google.com/p/modwsgi/  (选择3.3版本)

解压缩 : $tar xvfz mod_wsgi.X.Y.tar.gz

$cd mod_wsgi.X.Y

编译配置: $././configure –with-apxs=/usr/local/apache2/bin/apxs –with-python=/usr/local/bin/python # 指定Apache2的模块编译程序和Python解析器

编 译: $make

安 装: $make install

测 试: $python

2.3.1  配置Apache(修改/usr/local/apche2/confi/httpd.conf)

复制代码
# 加载wsgi模块
LoadModule wsgi_module modules/mod_wsgi.so
....
# HTTP请求处理脚本
WSGIScriptAlias /test /home/xxx/www/test.wsgi
<Directory "/home/xxx/www">
Order allow, deny
Allow from all
</Directory>
复制代码

2.3.2 编写test.wsgi(WSGI标准: http://www.python.org/dev/peps/pep-3333/ )

复制代码
def application(environ, start_response):
 status = '200 OK'
 output = 'Hello World!'
 
 response_headers = [('Content-type', 'text/plain'),
   ('Content-Length', str(len(output)))]
 start_response(status, response_headers)
 
 return [output]
复制代码

2.3.3  重启apche2

在任意网络浏览器中输入:http://www.mysite.com/test。看到“Hello World!”,恭喜你成功安装了WSGI模块。

参 考:

官方主页: http://code.google.com/p/modwsgi/
安装文档: http://code.google.com/p/modwsgi/wiki/QuickInstallationGuide
配置文档: http://code.google.com/p/modwsgi/wiki/QuickConfigurationGuide
WSGI文档: http://www.python.org/dev/peps/pep-3333/

2.4 Django的安装

下 载: https://www.djangoproject.com/download/  (选择1.4版本)

解压缩 : $tar xvfz Django-1.4.tar.gz

$cd Django-1.4

安 装: $python setup.py install

测 试:

$python
>>> import django
>>> print(django.get_version())

参 考:

官方主页: https://www.djangoproject.com/
安装文档: https://docs.djangoproject.com/en/1.4/intro/install/
快速入门: https://docs.djangoproject.com/en/1.4/intro/tutorial01/

3. Django中文支持

Django使用的是UTF-8编码,所以对于国际化支持不成问题。因为初次玩Django,中文显示乱,折腾死人了(一直在用的的mysql默认字符串是latin1编码,vim默认保存的文件编码为ascii)。最终得出结论,如果中文显示乱码,或者Django报错(… unicode …blabla…),请检查:

Django的设置。打开自己项目的settings.py,LANGUAGE_CODE=”zh_CN” ?FILE_CHARSET=’UTF-8′ ?DEFAULT_CHARSET=’utf-8′?
查看自己项目所有的文件编码是否以UTF-8编码保存的?确保.py文件第一行要加上:#-*-  coding:utf-8 -*- ?
HTML模板文件head部分,添加<meta http-equiv=“Content-Type” content=“text/html;charset=utf-8″/>
检查自己项目的数据库字符串编码是否为UTF-8,命令如下:
查看:

show create database dbname; 
show create table tablename; 
show full columns from tablename;

创建:

create database dbname CHARACTER SET utf8; 
create table tblname CHARACTER SET utf8; 

修改:

alter database dbname CHARACTER SET = utf8; 
alter table tablename CONVERT TO CHARACTER SET utf8;

4. Django应用的部署

Django应用的运行有两个方式,一种是在开发阶段,使用创建项目下面的manager.py runserver ip:port来启动一个用Python实现的轻型web服务器;另外一种就是通过mod_wsgi将你自己的应用部署到生产环境,对外提供服务。下面简单介绍一下Django的部署(虚拟主机上的配置,自行参考文档)。

假设你创建的Django项目文件列表如下:

复制代码
my-site
|- my-site
|- myapp
 |-static
 |- ...
|- static
 |- css
 |- js
 | ...
|- apache
|- ...
复制代码

4. 1. 创建Django项目的wsgi脚本(my-site/apache/django.wsgi),内容如下:

复制代码
import os, sys
 
sys.path.append('/.../www/')
sys.path.append('/.../www/my-site')
os.environ['DJANGO_SETTINGS_MODULE'] = 'my-site.settings'
os.environ['PYTHON_EGG_CACHE'] = '/.../www/.python-eggs'
 
import django.core.handlers.wsgi
 
_application = django.core.handlers.wsgi.WSGIHandler()
 
def application(environ, start_response):
  if environ['wsgi.url_scheme'] == 'https':
    environ['HTTPS'] = 'on'
  return _application(environ, start_response)
复制代码

4.2. 配置Apache(httpd.conf),内容如下:

复制代码
# 请求访问www.xxx.com/的时候,转到django.wsgi
WSGIScriptAlias / /.../www/my-site/apache/django.wsgi
 
<Directory /.../www/my-site/apache>
Order deny,allow
Allow from all
</Directory>
 
# 静态文件的访问路径配置
Alias /static/ /.../www/my-site/static/
 
<Directory /.../www/my-site/static>
Order deny,allow
Allow from all
</Directory>
复制代码

4.3. 配置setting.py

EBUG=False
自定义404.html,500.html模板(网页未找到、服务器内部错误)

4.4. 静态文件

STATIC_ROOT = ‘/…/www/my-site/static/'
STATIC_URL = ‘/static/'
$./manager.py collectstatic

注意:开发阶段,一般都会把相应app的静态文件,放在app目录下的static目录下。在正式生产环境部署的时候,使用./manager.py collectstatic来把所有静态文件收集到STATIC_ROOT指定的位置,包括管理后台的。

4.5. 重启apahce

浏览器输入相应的URL地址,看到你自己的web应用界面的话,恭喜大功告成!

5. 总结

本文主要介绍了一下Django开发环境的搭建、Django应用的部署和中文乱码的解决方法。具体如何使用Django快速地创建自己的web应用,并没有提及。Django相对来说,文档比较齐全,加上官方推出的一本书:《The Django Book》,相信只要开发环境搭建好,创建自己的Web应用也会非常容易。

进一步学习Django,请看:

Django1.4文档: https://docs.djangoproject.com/en/1.4/
Django Book 英文版: http://www.djangobook.com/en/2.0/
Django Book 中文版: http://djangobook.py3k.cn/2.0/

分类: Python编程 标签:

python 的日志logging模块学习

2016年5月18日 评论已被关闭

python 的日志logging模块学习

http://www.cnblogs.com/dkblog/archive/2011/08/26/2155018.html

1.简单的将日志打印到屏幕

 
import logging

logging.debug('This is debug message')
logging.info('This is info message')
logging.warning('This is warning message')

屏幕上打印:
WARNING:root:This is warning message

默认情况下,logging将日志打印到屏幕,日志级别为WARNING;
日志级别大小关系为:CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET,当然也可以自己定义日志级别。

2.通过logging.basicConfig函数对日志的输出格式及方式做相关配置

import logging

logging.basicConfig(level=logging.DEBUG,
               format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
               datefmt='%a, %d %b %Y %H:%M:%S',
               filename='myapp.log',
               filemode='w')
   
logging.debug('This is debug message')
logging.info('This is info message')
logging.warning('This is warning message')

./myapp.log文件中内容为:
Sun, 24 May 2009 21:48:54 demo2.py[line:11] DEBUG This is debug message
Sun, 24 May 2009 21:48:54 demo2.py[line:12] INFO This is info message
Sun, 24 May 2009 21:48:54 demo2.py[line:13] WARNING This is warning message

logging.basicConfig函数各参数:
filename: 指定日志文件名
filemode: 和file函数意义相同,指定日志文件的打开模式,’w’或’a’
format: 指定输出的格式和内容,format可以输出很多有用信息,如上例所示:
%(levelno)s: 打印日志级别的数值
%(levelname)s: 打印日志级别名称
%(pathname)s: 打印当前执行程序的路径,其实就是sys.argv[0]
%(filename)s: 打印当前执行程序名
%(funcName)s: 打印日志的当前函数
%(lineno)d: 打印日志的当前行号
%(asctime)s: 打印日志的时间
%(thread)d: 打印线程ID
%(threadName)s: 打印线程名称
%(process)d: 打印进程ID
%(message)s: 打印日志信息
datefmt: 指定时间格式,同time.strftime()
level: 设置日志级别,默认为logging.WARNING
stream: 指定将日志的输出流,可以指定输出到sys.stderr,sys.stdout或者文件,默认输出到sys.stderr,当stream和filename同时指定时,stream被忽略

3.将日志同时输出到文件和屏幕

import logging

logging.basicConfig(level=logging.DEBUG,
               format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
               datefmt='%a, %d %b %Y %H:%M:%S',
               filename='myapp.log',
               filemode='w')

#################################################################################################
#定义一个StreamHandler,将INFO级别或更高的日志信息打印到标准错误,并将其添加到当前的日志处理对象#
console = logging.StreamHandler()
console.setLevel(logging.INFO)
formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')
console.setFormatter(formatter)
logging.getLogger('').addHandler(console)
#################################################################################################

logging.debug('This is debug message')
logging.info('This is info message')
logging.warning('This is warning message')

屏幕上打印:
root        : INFO     This is info message
root        : WARNING  This is warning message

./myapp.log文件中内容为:
Sun, 24 May 2009 21:48:54 demo2.py[line:11] DEBUG This is debug message
Sun, 24 May 2009 21:48:54 demo2.py[line:12] INFO This is info message
Sun, 24 May 2009 21:48:54 demo2.py[line:13] WARNING This is warning message

4.logging之日志回滚

import logging
from logging.handlers import RotatingFileHandler

#################################################################################################
#定义一个RotatingFileHandler,最多备份5个日志文件,每个日志文件最大10M
Rthandler = RotatingFileHandler('myapp.log', maxBytes=10*1024*1024,backupCount=5)
Rthandler.setLevel(logging.INFO)
formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')
Rthandler.setFormatter(formatter)
logging.getLogger('').addHandler(Rthandler)
################################################################################################

从上例和本例可以看出,logging有一个日志处理的主对象,其它处理方式都是通过addHandler添加进去的。
logging的几种handle方式如下:

logging.StreamHandler: 日志输出到流,可以是sys.stderr、sys.stdout或者文件
logging.FileHandler: 日志输出到文件

日志回滚方式,实际使用时用RotatingFileHandler和TimedRotatingFileHandler
logging.handlers.BaseRotatingHandler
logging.handlers.RotatingFileHandler
logging.handlers.TimedRotatingFileHandler

logging.handlers.SocketHandler: 远程输出日志到TCP/IP sockets
logging.handlers.DatagramHandler:  远程输出日志到UDP sockets
logging.handlers.SMTPHandler:  远程输出日志到邮件地址
logging.handlers.SysLogHandler: 日志输出到syslog
logging.handlers.NTEventLogHandler: 远程输出日志到Windows NT/2000/XP的事件日志
logging.handlers.MemoryHandler: 日志输出到内存中的制定buffer
logging.handlers.HTTPHandler: 通过”GET”或”POST”远程输出到HTTP服务器

由于StreamHandler和FileHandler是常用的日志处理方式,所以直接包含在logging模块中,而其他方式则包含在logging.handlers模块中,
上述其它处理方式的使用请参见python2.5手册!

5.通过logging.config模块配置日志

#logger.conf

###############################################

[loggers]
keys=root,example01,example02

[logger_root]
level=DEBUG
handlers=hand01,hand02

[logger_example01]
handlers=hand01,hand02
qualname=example01
propagate=0

[logger_example02]
handlers=hand01,hand03
qualname=example02
propagate=0

###############################################

[handlers]
keys=hand01,hand02,hand03

[handler_hand01]
class=StreamHandler
level=INFO
formatter=form02
args=(sys.stderr,)

[handler_hand02]
class=FileHandler
level=DEBUG
formatter=form01
args=('myapp.log', 'a')

[handler_hand03]
class=handlers.RotatingFileHandler
level=INFO
formatter=form02
args=('myapp.log', 'a', 10*1024*1024, 5)

###############################################

[formatters]
keys=form01,form02

[formatter_form01]
format=%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s
datefmt=%a, %d %b %Y %H:%M:%S

[formatter_form02]
format=%(name)-12s: %(levelname)-8s %(message)s
datefmt=

上例3:

import logging
import logging.config

logging.config.fileConfig("logger.conf")
logger = logging.getLogger("example01")

logger.debug('This is debug message')
logger.info('This is info message')
logger.warning('This is warning message')

上例4:

import logging
import logging.config

logging.config.fileConfig("logger.conf")
logger = logging.getLogger("example02")

logger.debug('This is debug message')
logger.info('This is info message')
logger.warning('This is warning message')

6.logging是线程安全的

from:http://blog.csdn.net/yatere/article/details/6655445

分类: Python编程 标签:

Python.h: No such file or directory解决

2016年5月15日 评论已被关闭
分类: Python编程 标签:

python封装rsync

2016年5月12日 评论已被关闭

python封装rsync

http://88fly.blog.163.com/blog/static/122680390201271610284443/?suggestedreading&wumii

#!/usr/bin/env python
#wraps up rsync to synchronize two directories
from subprocess import call
import sys
import time

source = “/tmp/hbchen/” #Note the trailing slash
target = “/tmp/herb”
rsync = “rsync”
arguments = “-av”
cmd = “%s %s %s %s” % (rsync, arguments, source, target)

def sync():
while True:
ret = call(cmd, shell=True)
#print cmd
if ret !=0:
print “resubmitting rsync”
time.sleep(30)
else:
print “rsync was succesful”
sys.exit(0)
sync()

email

#!/usr/bin/env python
#wraps up rsync to synchronize two directories
from subprocess import call
import sys
import time

“””this motivated rysnc tries to synchronize forever”””

source = “/tmp/sync_dir_A/” #Note the trailing slash
target = “/tmp/sync_dir_B”
rsync = “rsync”
arguments = “-av”
cmd = “%s %s %s %s” % (rsync, arguments, source, target)

def sync():
while True:
ret = call(cmd, shell=True)
if ret !=0:
print “resubmitting rsync”
time.sleep(30)
else:
print “rsync was succesful”
subprocess.call(“mail -s ‘jobs done’
88fly@163.com“, shell=True)
sys.exit(0)
sync()

MySQL Connector/Python 安装、测试

2015年10月11日 评论已被关闭

MySQL Connector/Python 安装、测试

http://www.linuxidc.com/Linux/2013-08/88234.htm

安装Connector/Python:

# wget http://cdn.mysql.com/Downloads/Connector-Python/mysql-connector-python-1.0.11.zip
# unzip mysql-connector-python-1.0.11.zip
# cd mysql-connector-python-1.0.11
# python setup.py install

测试Connector/Python是否装上:

>>> from distutils.sysconfig import get_python_lib
>>> print get_python_lib()
/usr/local/lib/python2.7/site-packages

小实例:

[root@obe11g ~]# python
Python 2.7.3 (default, Jul 18 2013, 20:53:58)
[GCC 3.4.6 20060404 (Red Hat 3.4.6-3.1)] on linux2
Type “help”, “copyright”, “credits” or “license” for more information.
>>> import mysql.connector
>>> cnx = mysql.connector.connect(user=’waterbin’,password=’123′,host=’192.168.1.115′,database=’test’)
>>> cur=cnx.cursor()
>>> cur.execute(‘select * from t’)
>>> print cur.fetchall()
[(1,)]

>>> cnx.close()

本篇文章来源于 Linux公社网站(www.linuxidc.com) 原文链接:http://www.linuxidc.com/Linux/2013-08/88234.htm

分类: Python编程 标签:

Ubuntu下使用Python连接MySQL数据库

2015年10月10日 评论已被关闭

Ubuntu下使用Python连接MySQL数据库

http://www.linuxidc.com/Linux/2014-03/97819.htm

如果要在Ubuntu下使用Python连接MySQL只要两个步骤就ok。

第一步: 在终端下输入sudo apt-get install python-mysqldb

第二不: 在终端下测试

如果可以导入MySQLdb的包说明,可以成功的使用MySQL

第三步:可以写个代码测试一下,这里不做演示

分类: Python编程 标签:

Windows 下面安装和使用Python, IPython NoteBook (详细步骤)

2015年9月26日 评论已被关闭

Windows 下面安装和使用Python, IPython NoteBook (详细步骤)

http://my.oschina.net/u/1431433/blog/189337

1. 下载安装Python

下载: python-3.3.3.amd64.msi (救在Python.org下载就好了)

安装: 直接双击安装

2. 下载安装Setuptools

下载ez_setup.py 到某一个目录(如: e:\tools\ez_setup.py), 下载地址: http://www.pip-installer.org/en/latest/installing.html#install-or-upgrade-setuptools

安装: 进入e:\tools\, 运行:

c:\Python33\python.exe ez_setup.py

在这个过程中, 系统会连接网络下载所需要的安装包并完成安装. 这样就可以使用easy_install了。

3. 下载安装pip

下载ez_setup.py 到某一个目录(如: e:\tools\get-pip.py), 下载地址: http://www.pip-installer.org/en/latest/installing.html#install-or-upgrade-setuptools

安装: 进入e:\tools\, 运行:

c:\Python33\python.exe get-pip.py

在这个过程中, 系统会连接网络下载所需要的安装包并完成安装

4. 设置环境变量

把c:\Python33 和c:\Python33\Scripts 都添加到环境变量中. 如

c:>set PATH=%PATH%;c:\Python33;c:\Python33\Scripts

作完前面四步, 就可以在Windows下面开始使用Python了.

1. 下载安装IPython:

c:>pip.exe install ipython

系统就会去网上寻找ipython的包, 进行下载及安装. 等待差不多5分钟, 整个安装就完成了, 并且还把pyreadline也安装了. ipython3.exe被安装在c:\Python33\Scripts下面, 因为前面添加过环境变量的路径支持, 所以可以直接输入:

c:>ipython3.exe

081018_5vs9_1431433

2. 尝试Notebook, 还需要下载一些其它咚咚

1) 下载安装 pyzmq, 在这里不建议使用pip, pip对pyzmq支持不太好,装不上。我尝试使用easy_install

c:>easy_install.exe pyzmq

2) 下载安装 jinja2,

c:>easy_install.exe jinja2

3) 下载安装 tornado,

c:>easy_install.exe tornado

好了,使用下面命令就可以把Notebook起来:

c:>ipython3.exe notebook

083308_rbto_1431433

3. 尝试科学计算的画图工具matplotlib

因为安装的ipython是1.1的版本,所以已经支持了%matplotlib的magic code, 但是还得下载matplotlib本身。

1)  下载安装nose

c:>pip.exe install nose

2)  为了省去麻烦,在这一步下载,从这个链接可以得到http://www.lfd.uci.edu/~gohlke/pythonlibs/

要注意的是,因为我们使用的是python3.3, 所以一定也要选py3.3的numpy,否则不能装。大概有28M。直接安装,它会依照Windows注册表里面登记的PythonInstall 来确定安装路径。
3) 最后安装matplotlib. 但由于一些问题, pip和easy_install都按不了, 所以还是直接在网上下载matplotlib的安装包. https://github.com/matplotlib/matplotlib/downloads/ 这个网址上面有, 选择64位支持python3.3的版本即可.

matplotlib-1.2.0.win-amd64-py3.3.exe
4) 但还差一点点, 系统提示还需要安装Scipy.  依旧到这个网站http://www.lfd.uci.edu/~gohlke/pythonlibs/#scipy-stack 下载 scipy-0.13.2.win-amd64-py3.3.exe

好了, 这就大功告成了.

在notebook中, 试试下面的程序:
================================
import numpy as np
from scipy.ndimage import filters
import io
import matplotlib
import matplotlib.image as mpimg
img = np.zeros((300, 300))
img[np.random.randint(0, 300, 1000), np.random.randint(0, 300, 1000)] = 255
img2 = filters.gaussian_filter(img, 4, order=2)

import io
import matplotlib
import matplotlib.image as mpimg
from IPython import display
buf = io.BytesIO()
matplotlib.image.imsave(buf, img2, cmap=”gray”)
display.Image(buf.getvalue())

分类: Python编程 标签:

python模块介绍-Tornado:Tornado中文文档-概述

2015年9月11日 评论已被关闭

python模块介绍-Tornado:Tornado中文文档-概述

http://my.oschina.net/u/1433482/blog/425888

 

python模块介绍-Tornado:Tornado中文文档-概述 – 磁针石的个人空间 – 开源中国社区

快速链接

快速入门

1
2
3
4
5
6
7
8
9
10
11
12
import tornado.ioloop
import tornado.web
class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world")
application = tornado.web.Application([(r"/", MainHandler),])
if __name__ == "__main__":
    application.listen(8888)
    tornado.ioloop.IOLoop.instance().start()

用浏览器或者curl等访问http://localhost:8888/,会返回”Hello, world”。

# 服务器端执行
$ python test.py 
WARNING:tornado.access:404 GET /favicon.ico (127.0.0.1) 0.81ms
WARNING:tornado.access:404 GET /favicon.ico (127.0.0.1) 0.81ms
# 客户端执行
$ curl http://localhost:8888/Hello, world

这个例子没有用到Tornado的异步功能,异步的实例参见chatdemo.py

Introduction-to-Tornado中介绍的实例稍微复杂点:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
from tornado.options import define, options
define("port", default=8888help="run on the given port"type=int)
class IndexHandler(tornado.web.RequestHandler):
    def get(self):
        greeting = self.get_argument('greeting''Hello')
        self.write(greeting + ', friendly user!')
if __name__ == "__main__":
    tornado.options.parse_command_line()
    app = tornado.web.Application(handlers=[(r"/", IndexHandler)])
    http_server = tornado.httpserver.HTTPServer(app)
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.instance().start()

执行结果:

# 服务器端执行
$ python hello.py --port=8000
[I 150525 08:41:53 web:1825] 200 GET / (127.0.0.1) 0.85ms
[I 150525 08:42:26 web:1825] 200 GET /?greeting=Salutations (127.0.0.1) 0.68ms
# 客户端执行
$ curl http://localhost:8000/
Hello, friendly user!
$ curl http://localhost:8000/?greeting=Salutations
Salutations, friendly user!

这里增加了tornado.options.parse_command_line()用于解析http参数。上例中用application.listen(8888)直接启动http服务,这里改为用tornado.httpserver.HTTPServer启动。

Introduction-to-Tornado中字符串实例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import textwrap
import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
            
from tornado.options import define, options
define("port", default=8888help="run on the given port"type=int)
    class ReverseHandler(tornado.web.RequestHandler):
    def get(selfinput):
        self.write(input[::-1+ '\n')class WrapHandler(tornado.web.RequestHandler):
    def post(self):
        text = self.get_argument('text')
        width = self.get_argument('width'40)
        self.write(textwrap.fill(text, int(width)) + '\n')
if __name__ == "__main__":
    tornado.options.parse_command_line()
    app = tornado.web.Application(handlers=[
        (r"/reverse/(\w+)", ReverseHandler),
        (r"/wrap", WrapHandler)
    ])
    http_server = tornado.httpserver.HTTPServer(app)
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.instance().start()

执行结果:

# 服务器端执行
$ python string_service.py --port=8000
[I 150525 09:01:18 web:1825] 200 GET /reverse/stressed (127.0.0.1) 0.56ms
[I 150525 09:01:24 web:1825] 200 GET /reverse/slipup (127.0.0.1) 0.65ms
[I 150525 09:01:59 web:1825] 200 POST /wrap (127.0.0.1) 1.89ms
[I 150525 09:02:14 web:1825] 200 POST /wrap (127.0.0.1) 0.97ms

# 客户端执行
$ curl http://localhost:8000/reverse/stressed
desserts
$ curl http://localhost:8000/reverse/slipup
pupils
$ curl http://localhost:8000/wrap -d text=Lorem+ipsum+dolor+sit+amet,+consectetuer+adipiscing+elit.Lorem ipsum dolor sit amet, consectetuer
adipiscing elit.
$ curl http://localhost:8000/wrap -d text=hello
hello

在上面的代码中,Application类在”handlers”参数中实例化了两个RequestHandler类对象。

“/reverse/(\w+)”中,正则表达式告诉Tornado匹配任何以字符串/reverse/开始并紧跟着一个或多个字母的路径。括号的含义是 让Tornado保存匹配括号里面表达式的字符串,并将其作为请求方法的一个参数传递给RequestHandler类。“get(self, input):”中有一个额外的参数input。这个参数将包含匹配处理函数正则表达式第一个括号里的字符串, 如果正则表达式中有一系列额外的括号,匹配的字符串将被按照在正则表达式中出现的顺序作为额外的参数传递进来。

WrapHandler类处理匹配路径为/wrap的请求。这个处理函数定义了一个post方法,也就是说它接收HTTP的POST方法的请求。Tornado可以解析URLencoded和multipart结构的POST请求。

常见的读写数据库可以结合post和get实现,比如(非实际可执行的例子):

# matched with (r"/widget/(\d+)", WidgetHandler)class WidgetHandler(tornado.web.RequestHandler):
    def get(self, widget_id):
        widget = retrieve_from_db(widget_id)
        self.write(widget.serialize())

    def post(self, widget_id):
        widget = retrieve_from_db(widget_id)
        widget['foo'] = self.get_argument('foo')
        save_to_db(widget)

HTTP请求(GET、POST、PUT、DELETE、HEAD、OPTIONS)可以非常容易地定义,只需要在RequestHandler类中使用 同名的方法。下面是另一个想象的例子,在这个例子中针对特定frob ID的HEAD请求只根据frob是否存在给出信息,而GET方法返回整个对象:

1
2
3
4
5
6
7
8
9
10
11
# matched with (r"/frob/(\d+)", FrobHandler)class FrobHandler(tornado.web.RequestHandler):
    def head(self, frob_id):
        frob = retrieve_from_db(frob_id)
        if frob is not None:
            self.set_status(200)
        else:
            self.set_status(404)
    def get(self, frob_id):
        frob = retrieve_from_db(frob_id)
        self.write(frob.serialize())

使用RequestHandler类的set_status()方法显式地设置HTTP状态码。然而,你需要记住在某些情况下,Tornado会自动地设置HTTP状态码。下面是一个常用情况的纲要:

  • 404 Not Found: Tornado会在HTTP请求的路径无法匹配任何RequestHandler类相对应的模式时返回404(Not Found)响应码。
  • 400 Bad Request: 如果你调用了一个没有默认值的get_argument函数,并且没有发现给定名称的参数,Tornado将自动返回一个400(Bad Request)响应码
  • 405 Method Not Allowed: 如果传入的请求使用了RequestHandler中没有定义的HTTP方法(比如,一个POST请求,但是处理函数中只有定义了get方 法),Tornado将返回一个405(Methos Not Allowed)响应码。
  • 500 Internal Server Error: 当程序遇到任何不能让其退出的错误时,Tornado将返回500(Internal Server Error)响应码。你代码中任何没有捕获的异常也会导致500响应码。
  • 200 OK: 如果响应成功,并且没有其他返回码被设置,Tornado将默认返回一个200(OK)响应码。

错误发生时Tornado将默认向客户端发送一个包含状态码和错误信息的简短片段。 可以在你的RequestHandler重载write_error方法自定义错误信息,比如:

import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web

from tornado.options import define, options
define("port", default=8888, help="run on the given port", type=int)

class IndexHandler(tornado.web.RequestHandler):
    def get(self):
        greeting = self.get_argument('greeting', 'Hello')
        self.write(greeting + ', friendly user!')
        
    def write_error(self, status_code, **kwargs):
        self.write("Gosh darnit, user! You caused a {0} error.\n".format(
            status_code))

if __name__ == "__main__":
    tornado.options.parse_command_line()
    app = tornado.web.Application(handlers=[(r"/", IndexHandler)])
    http_server = tornado.httpserver.HTTPServer(app)
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.instance().start()

执行结果:

# 服务器端执行
$ python hello-error.py --port=8000
[W 150525 09:58:29 web:1825] 405 POST / (127.0.0.1) 1.39ms

# 客户端执行
$ curl -d foo=bar http://localhost:8000/
Gosh darnit, user! You caused a 405 error.

安装

自动安装:

# pip install tornado

PyPI中包含Tornado,可以通过pip或easy_install来安装。这种方式没有包含源代码中的demo程序,下载的源码包可以解决该问题。

手动安装:

# wget https://pypi.python.org/packages/source/t/tornado/tornado-4.1.tar.gz
# tar xvzf tornado-4.1.tar.gz
# cd tornado-4.1
# python setup.py build
# sudo python setup.py install

预置条件:Tornado支持Python2.6、2.7、3.2、3.3和3.4。依赖certifi,Python 2还依赖backports.ssl_match_hostname,pip或easy_install自动安装依赖。有些Tornado特性可能依赖以下库:

  • unittest2: 在Python2.6执行test suite需要。
  • concurrent.futures: Tornado推荐的线程池,允许使用ThreadedResolver。Python 2需要,Python3中标准库已经包含该功能。
  • pycurl:tornado.curl_httpclient中选择是否使用。要求用7.18.2或更高版本,建议7.21.1或更高版本。
  • twisted: tornado.platform.twisted类可能用到。
  • pycares: 当线程是不适合时用作非阻塞DNS解析器。
  • Monotime: 增加单调时钟,在时钟调整频繁环境中提高可靠性。在Python 3.3不再需要。

平台:Tornado运行在类unix平台,最佳的性能和扩展性体现在Linux(epoll)和BSD(kqueue)(尽管Mac OS X上源于BSD且支持的kqueue,它的网络性能较差,因此只建议用于开发)。Tornado也可在Windows上运行,但不是官方支持和建议仅供开 发使用。

授权:Tornado是Facebook开源的一部分,基于Apache License 2.0。文档基于Creative Commons 3.0。

参考资料

分类: Python编程 标签:

Python多层嵌套list的递归处理方法

2015年9月11日 评论已被关闭

Python多层嵌套list的递归处理方法
http://blog.sina.com.cn/s/blog_53d874320102vehd.html
问题:用Python处理一个多层嵌套list
[‘and’, ‘B’, [‘not’, ‘A’],[1,2,1,[2,1],[1,1,[2,2,1]]], [‘not’, ‘A’, ‘A’],[‘or’, ‘A’, ‘B’ ,’A’] , ‘B’]
需求1)如何展开成一层?
需求2)如何删除重复的元素? 包括重复的list, 要考虑子list的重复元素删除后造成的子list重复

#!/usr/bin/env python
# -*- coding: utf-8 -*-

def unilist(ll):

“””
功能:用递归方法删除多层列表中重复元素
“””

result = []
for i in ll:
if isinstance(i, list):
if unilist(i) not in result:
result.append(unilist(i))
else:
if i not in result:
result.append(i)
return result

def flatten(ll):
“””
功能:用递归方法展开多层列表,以生成器方式输出
“””
if isinstance(ll, list):
for i in ll:
for element in flatten(i):
yield element
else:
yield ll
testcase= [‘and’, ‘B’, [‘not’, ‘A’],[1,2,1,[2,1],[1,1,[2,2,1]]], [‘not’, ‘A’, ‘A’],[‘or’, ‘A’, ‘B’ ,’A’] , ‘B’]

print unilist(testcase)

print list(flatten(testcase))

运行结果
[‘and’, ‘B’, [‘not’, ‘A’], [1, 2, [2, 1], [1, [2, 1]]], [‘or’, ‘A’, ‘B’]]
[‘and’, ‘B’, ‘not’, ‘A’, 1, 2, 1, 2, 1, 1, 1, 2, 2, 1, ‘not’, ‘A’, ‘A’, ‘or’, ‘A’, ‘B’, ‘A’, ‘B’]

分类: Python编程 标签:

Tornado的三大核心模块与处理流程

2015年9月10日 评论已被关闭

Tornado的三大核心模块与处理流程

http://www.nowamagic.net/academy/detail/1332113

Hello World

下面是 Tornado 官网提供的一个hello world的代码示范,我们来分析下程序的构成。

01 import tornado.ioloop
02 import tornado.web
03  
04 class MainHandler(tornado.web.RequestHandler):
05     def get(self):
06         self.write("Hello, world")
07  
08 application = tornado.web.Application([
09     (r"/", MainHandler),
10 ])
11 if __name__ == "__main__":
12     application.listen(8888)
13     tornado.ioloop.IOLoop.instance().start()

实现非常简单,只需要定义自己的处理方法,其它的东西全部交给 Tornado 完成。

首先创建 web application,并把我们的处理方法 MainHandler 传递过去。然后在8888开始监听。最后启动事件循环,开始监听网络事件,主要是 socket 的读和写。

Python 又是这样一种便捷的语言,上面这段代码直接贴到文本中,无需编译,就可以直接运行,一个 server 就产生了。

模块分析

Tornado 为了实现高并发和高性能,使用了一个 IOLoop 来处理 socket 的读写事件,IOLoop 基于 epoll,可以高效的响应网络事件。这是 Tornado 高效的保证。

为了在处理请求的时候,实现对 socket 的异步读写,Tornado 实现了 IOStream 类,用来处理 socket 的异步读写。

HTTPConnection 这个类用来处理 http 的请求,包括读取http请求头,读取post过来的数据,调用用户自定义的处理方法,以及把响应数据写给客户端socket。

以上就是 Tornado 服务器有3大核心模块,下面这幅图描述了 tornado 服务器的大体处理流程,接下来我们将会详细分析每一步流程的实现。

2013_10_14_05
分类: Python编程 标签:

Tornado的背景与特性

2015年9月10日 评论已被关闭

Tornado的背景与特性

http://www.nowamagic.net/academy/detail/1332105

Tornado 是一个开源的网络服务器框架,该平台基于社交聚合网站 FriendFeed 的实时信息服务开发而来。2007年,4名谷歌前软件工程师一起创办了 FriendFeed,旨在使用户能方便地跟踪好友在 Facebook 和 Twitter 等多个社交网站上的活动。结果两年后,Facebook 宣布收购 FriendFeed,这一交易的价格约为5000万美元。而此时,FriendFeed 只有12名员工。据说这帮人后来又到了 Google,搞出了现在的Google App Engine ……

Tornado 是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本。这个 Web 框架看起来有些像 web.py 或者 Google 的 webapp,不过为了能有效利用非阻塞式服务器环境,这个 Web 框架还包含了一些相关的有用工具和优化。

Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快。得利于其非阻塞的方式和对 epoll 的运用,Tornado 每秒可以处理数以千计的连接,这意味着对于实时 Web 服务来说,Tornado 是一个理想的 Web 框架。

我们开发这个 Web 服务器的主要目的就是为了处理 FriendFeed 的实时功能 ——在 FriendFeed 的应用里每一个活动用户都会保持着一个服务器连接。

2013_10_14_02

模块

Tornado 是个轻量级框架,它的模块不多,最重要的一个模块是web, 它就是包含了 Tornado 的大部分主要功能的 Web 框架。其它的模块都是工具性质的, 以便让 web 模块更加有用 后面的 Tornado 攻略 详细讲解了 web 模块的使用方法。

主要模块

  • web – FriendFeed 使用的基础 Web 框架,包含了 Tornado 的大多数重要的功能
  • escape – XHTML, JSON, URL 的编码/解码方法
  • database – 对 MySQLdb 的简单封装,使其更容易使用
  • template – 基于 Python 的 web 模板系统
  • httpclient – 非阻塞式 HTTP 客户端,它被设计用来和 web 及 httpserver 协同工作
  • auth – 第三方认证的实现(包括 Google OpenID/OAuth、Facebook Platform、Yahoo BBAuth、FriendFeed OpenID/OAuth、Twitter OAuth)
  • locale – 针对本地化和翻译的支持
  • options – 命令行和配置文件解析工具,针对服务器环境做了优化

底层模块

  • httpserver – 服务于 web 模块的一个非常简单的 HTTP 服务器的实现
  • iostream – 对非阻塞式的 socket 的简单封装,以方便常用读写操作
  • ioloop – 核心的 I/O 循环
分类: Python编程 标签:

CentOS6.4安装python2.7.3环境和Tornado

2015年9月10日 评论已被关闭

CentOS6.4安装python2.7.3环境和Tornado

http://www.th7.cn/Program/Python/201407/238613.shtml

CentOS6.4安装python2.7.3环境和Tornado-Python-第七城市

Centos6.4默认的python环境是2.6.6。我们可以自己安装Python 2.7.3。

但是值得注意的是,我们必须不能破坏系统的环境。

因为几个关键的实用应用程序依赖于Python2.6.6。

如果替换了系统的python环境就会发生很多难以预见的错误,导致要重装系统。

在没有破坏系统的python环境的情况下安装Python 2.7.3。

执行以下命令,请使 用root的身份登录或者使用sudo命令

一、安装Python 2.7.3

1. 安装开发工具

为了编辑Python,你必须要先安装开发工具盒一些额外的库。

这些额外的库并不严格的需要,但是如果不安装,新版本的python编译器可能没法工作。

所以建议先安装。

# yum groupinstall “Development tools”

# yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel

2. 下载和安装Python

下面有个一个非常重要的步骤是我们使用的是make altinstall。

如果使用make install,你将会看到在系统中有两个不同版本的Python在/usr/bin/目录中。

这将会导致很多问题,而且不好处理。

# wget http://python.org/ftp/python/2.7.3/Python-2.7.3.tar.bz2

# tar xf Python-2.7.3.tar.bz2

# cd Python-2.7.3

# ./configure –prefix=/usr/local

# make && make altinstall

运行以上命令后,你可以在目录/usr/local/bin/python2.7 看到新编译的环境。

系统的环境python 2.6.6是在/usr/bin/python目录 和 /usr/bin/python2.6目录 .

3. 下载和安装Distribute

Distribute提供一个安装python模块的框架。

你系统的每一个python解释器都需要它自己的Distribute。

你可以自己找到最新版本的Distribute,在这里https://pypi.python.org/pypi/distribute

# wget http://pypi.python.org/packages/source/d/distribute/distribute-0.6.35.tar.gz

# tar xf distribute-0.6.35.tar.gz

# cd distribute-0.6.35

# python2.7 setup.py install

这将产生一个脚本/usr/local/bin/easy_install-2.7 ,你可以使用它来安装python 2.7 模块。

它将安装的模块放到 /usr/local/lib/python2.7/site-packages/目录中。

4. VirtualEnv构建Python虚拟机工作环境

virtualenv是Python开发常用的工具之一,它可以帮助开发者建立一个独立的虚拟的环境,

开发者可以将自己需要用的pythonpackage装入到这个虚拟环境中,

这样就和系统全局的其他package隔离了,不会影响系统的package布局,

要使用这些安装在虚拟环境中的模块,只需要activate进行该环境就OK了,

不activate的话就不能使用那些在虚拟环境中的模块,就像从没安装过一样。

# easy_install-2.7 virtualenv

# virtualenv-2.7 –distribute someproject

New python executable in someproject/bin/python2.7

Also creating executable in someproject/bin/python

Installing distribute……………….done.

Installing pip…………….done.

# source someproject/bin/activate

(someproject)# python –version

Python 2.7.3

(someproject)#

二、安装Tornado

1、下载tornado

$wget –no-check-certificate https://pypi.python.org/packages/source/t/tornado/tornado-4.0.tar.gz

2、解压编译安装

$ tar -zxvf tornado-4.0.tar.gz

$ cd tornado-4.0

$ python setup.py build

$ python setup.py install

3、创建测试文件

import tornado.ioloop

import tornado.web

class MainHandler(tornado.web.RequestHandler):

def get(self):

self.write(“Hello, world”)

application = tornado.web.Application([

(r”/”, MainHandler),

])

if __name__ == “__main__”:

application.listen(8888)

tornado.ioloop.IOLoop.instance().start()

4、运行文件

$ python tornado_example.py

1) 出现下面的错误

import zlib

ImportError: No module named zlib

解决方法:再次编译python。 进入python源程序目录执行 :

$./configure –with-zlib

$make && make install

2) 出现下面的错误

Traceback (most recent call last):

File “./tornado_example.py”, line 5, in <module>

import tornado.web

File “/usr/local/python2.7.3/lib/python2.7/site-packages/tornado/web.py”, line 80, in <module>

from tornado import iostream

File “/usr/local/python2.7.3/lib/python2.7/site-packages/tornado/iostream.py”, line 40, in <module>

from tornado.netutil import ssl_wrap_socket, ssl_match_hostname, SSLCertificateError

File “/usr/local/python2.7.3/lib/python2.7/site-packages/tornado/netutil.py”, line 44, in <module>

import backports.ssl_match_hostname

ImportError: No module named backports.ssl_match_hostname

解决方法:

tornado.3.*运行在python2.*上必须要安装backports.ssl_match_hostname包

backports.ssl_match_hostname下载链接:http://pan.baidu.com/s/1jGn18Bc 密码:yiz3

安装次包前需先安装setuptools

setuptools下载链接:http://pan.baidu.com/s/12AYdw 密码:xozt

安装方法均为python库的正常安装方法:

python setup.py build

python setup.py install

5. 再次运行python tornado_example.py,

然后打开浏览器,输入http://ip:8888就看到页面输出Hello, world了。

表明已经OK了。

Python IDE:PyCharm中的那些实用功能

2015年9月10日 评论已被关闭

Python IDE:PyCharm中的那些实用功能

http://blog.jobbole.com/51498/

到目前为止,我用Eclipse已经有一些年头了,大部分的时间都是用来写Python(安装Pydev插件)以及C++(安装CDT插件)。

最近我从一个好友那听说了PyCharm以及它新的免费社区版logr。我这个朋友用Eclipse也很长时间了,对PyCharm也是赞不绝口,所以我决定至少在家办公的时候试着用用PyCharm。目前为止,我已经深深的喜欢上了它,甚至于在日常工作时也用PyCharm(社区版采用Apache2授权)。

以下我将会介绍一些在我在使用PyCharm时感到惊奇的一些事情。

声明

我无意批评Eclipse或者PyDev,我用了它们很多年,它们很棒!请记住,这是我的个人经验,你的或许有所不同。

实时比较

PyCharm 对一个文件里你做的改动保持实时的跟踪,通过在编辑器的左侧栏显示一个蓝色的标记。
diff-1
这一点非常方便,我之前一直是在Eclipse里面用命令“Compare against HEAD” 来比较一个文件前后的改动。

在PyCharm中,你可以对你的改动一览无余。同时,点击那个标记,会显示出之前的内容以及一个工具栏:
diff-2
你可以很容易地回滚这些改动,在一个详尽的对话框中查看这些改动或是将之前的文本粘贴到剪切板上。

提交时的比较预览

在Eclipse 中,当你提交改动时,会有一个提交对话框向你展示将要被提交的文件列表。

你可以双击其中任意一项来查看改动的对比:这时候,如果你看到代码里一些想修改的地方(比如一个拼错的单词,一段

遗漏的文档,等等),那可就不爽了:你必须关闭所有的东西(包括带有你精心写好的提交注释的提交框),去找到那处惹人烦的代码,改正,然后从头再来一遍。

PyCharm 有同样的特性,但是你的改动是可编辑的。我简直不能再去强调可以当场修正那些错误有多么棒啦!

pycharm-commit-diff

在提交过程中,我可以很容易地修复像上面那些类似的拼写错误。

一个额外好处是,无论你因为何种原因关闭了提交对话框,当再次尝试提交时,它会保留你刚才填写的那些提交注释。

提交时检查

在提交过程中,我们还可以在实际提交前执行其他一些选项,像“优化导入(排序并移除未使用过的导入)“,检查变动集合中的待完成项等等。

commit

一个有意思的地方是”执行代码分析“那一项。。。

代码审查

你可以让PyCharm在一个文件,目录或整个项目里执行“代码审查”操作。它会在无需实际执行程序的情况下,

找出存在问题以及相应的改进办法,比如类型检查,可静态的方法,违反代码规范等等问题。

正如在上一节中解释过的,这也可以在提交时在发生改动的文件中自动完成。这是一个文件一次审查之后的结果:

inspection

对于其中一些审查结果来说,你还可以应用一个修复建议。例如,对于“Function call can be replaced with set literal()”这一建议,我们可以选择相应的选项来修复。

PyCharm 会将这句:

extensions = set(['.avi', '.mp4', '.mpg', '.mkv'])

自动替换为:

extensions = {'.avi', '.mp4', '.mpg', '.mkv'}

你可以关闭任何你不希望的审查,包括在项目一级。

重构

我一直在试图重命名一个模块,可在菜单项里一直找不到那一项。。。F2也无济于事。

突然我注意到文件子菜单下面的”重构/重命名“一项,就想。。。会是它吗?果然就是!

在你重命名一个模块时,PyCharm会询问你是否需要自动修改所有与之关联的项目。有福了!

还有很多其他的重构项目,但目前为止我还没有机会一一尝试。

关于过时代码的提示以及改进建议

PyCharm可以告诉你代码里面过时的结构块,并且提出一些改进建议。比如,我有像下面一段这样的代码:

with nested(open(filename1), open(filename2)) as (f1, f2):
 <代码块>

PyCharm会明显的标注出nested:

nested-obsolete

我用的是Python2.7,事实上你可以使用嵌套上下文管理器,但是,唉,我还得支持python的一些老版本,就保留了nested。

但PyCharm提醒了我,这个事情本身还是很酷的。

任务+特性 分支

如同Eclipse一样(需要Mylin支持),PyCharm也支持基于任务的工作流(包括任务感知的上下文)。

然而PyCharm本身自带了很多直接可用的连接器(GitHub,Mantis,Jira,Bugzilla,等等)。

而且,当你开启一项任务时,它会询问你是否想要创建那个任务的一个特性分支,分支的名字可以配置。

task-branch
这就避免了必须手动创建一个新的分支,而这个操作确实挺繁琐的(拿到任务的ID,选择名称,等等)。

这个是加分项。

快速

我观察到PyCharm在执行代码的自动完成时扫瞄代码的速度要远快于Eclipse,而且还不打断你当前的工作。

当你想保存一个文件时,Eclipse会阻止你这么做因为它正在后台执行一个任务,这有多惹人烦。。。

快速查看文档

当你把光标挪到一个函数、方法,类或者别的什么上的时候,你会得到一个选项来浏览”快速文档“。看一眼:

quick-doc

正如你看到的,它会用一种赏心悦目的格式展示方法的文档说明,还从代码使用说明中提示了参数的类型。。。即使该函数没有对应的文档说明,你还是会得到像下面这样的一个说明:

quick-doc-2

很好!

Docutils 支持

PyCharm 还包括了对于doctils的一流支持,这让它很容易从集成开发环境中直接再生成文档。

另一方面,它还包括了一个非常好的富文本(译者注:ReST即reStructuredTexteditor)编辑器(比Eclipse的IMHO好用的多):

rst

完善的插件系统

跟据我的使用经验,在Eclipse里面安装插件是件挺痛苦的事情:

  •  很难找到你想要去的地方(提示: 帮助/安装新软件。。。);
  • 你没有一个单一的索引,所以你得去网上去找那些插件源;
  • 系统有时会因为库的依赖问题而崩溃,结果我就没装上那些我想要的插件(工作中还有其他人也同样遇到这个问题,最后不得不放弃);

PyCharm的插件体验则要流畅地多。

首先,它位于一个你认为它有可能会存在的地方:就在”设置”下面的一项:

plugins
你可以很容易地浏览插件:
plugins-browse
我快速安装了一个标记编辑器(和ReST一样),一个临时存放代码片段的插件,可以让我直接从选择的文本中快速地剪贴,并且预览代码,和SublimeText类似,还用一个漂亮的代码外观。

结语

目前为止就这些了。我会向我的朋友尽力展示一切我认为“看这有多酷”的事情。我使用PyCharm的时间很短,如果我发现还有更多有趣的事情值得再写一篇发表的话,我会继续写。