originally created by shuliang under CC BY-NC-ND 3.0 license
一、引言
学习编程,好比练功,总得先有个环境,搭台子是必须的。为了照顾初学者,很多时候台子已经搭好了,比如用Python,IDE、Terminal下直接敲命令运行就可以了,但有些时候还是需要自己动手配置,今天的tornado即是如此。好在Mac比较人性化,Python、easy_install、pip都是开箱即用,安装tornado也就是一条命令就搞定的事。但直接在系统环境中安装不利于多版本和睦相处,不和谐,因此秉承“不折腾不舒服”之精神,创建tornado与系统隔离的环境是必要的,这样在练习的时候可以很方便的为每个案例设置不同的运行环境。
为Python创建虚拟环境,一般大家推荐virtualenv,但zc.buildout同样优秀甚至更强大,现在我们就来试试这两种方法。
安装环境:MacOS Mavericks (10.9.1)
二、创建虚拟环境
1.方法一:virtualenv
virtualenv能创建多个Python运行环境,各环境相互独立,彼此不影响,官方介绍见这。
1.1 安装
virtualenv可以用pip或者easy_install安装(输入的命令用红色显示,以便区分,下同):
1 localhost:~ leo$ pip install virtualenv 2 Requirement already satisfied (use --upgrade to upgrade): virtualenv in /usr/local/lib/python2.7/site-packages/virtualenv-1.10.1-py2.7.egg 3 Cleaning up... 4 localhost:~ leo$
1.2 新建虚拟环境
安装完virtualenv后,就可以用virtualenv命令来创建一个”helloworld“的虚拟环境(实质是一个文件夹,我是将其放到~/python/下的,以下操作都是在~/python这个目录里面进行的,如果在~/目录下操作也是可行的,请注意)。
1 localhost:python leo$ virtualenv --no-site-packages helloworld 2 New python executable in helloworld/bin/python 3 Installing Setuptools..............................................................................................................................................................................................................................done. 4 Installing Pip.....................................................................................................................................................................................................................................................................................................................................done. 5 localhost:python leo$
默认情况下,virtualenv会引用系统Python中site-packages中的库,我们设置--no-site-packages参数是为了取消对系统Python库的引用,创建完全隔离的Python环境。这时候virtualenv已经为我们创建了bin, include, lib三个文件夹:
1 localhost:python leo$ ls helloworld/ 2 bin include lib 3 localhost:python leo$
我们先来看一下lib中目前已有的库文件:
1 localhost:python leo$ ls helloworld/lib/python2.7/site-packages/ 2 _markerlib pkg_resources.py 3 easy_install.py pkg_resources.pyc 4 easy_install.pyc setuptools 5 pip setuptools-0.9.8-py2.7.egg-info 6 pip-1.4.1-py2.7.egg-info 7 localhost:python leo$
可以看到目前库文件中还没有包含tornado库,下面我们就来安装tornado库。
1.3 虚拟环境中安装tornado
同样,我们可以用pip或者easy_install来安装tornado库,但这次不是用系统层面的pip或easy_install工具,而是用virtualenv设置好的pip或easy_install。我们看一下helloworld/bin目录:
1 localhost:python leo$ ls helloworld/bin 2 activate easy_install python 3 activate.csh easy_install-2.7 python2 4 activate.fish pip python2.7 5 activate_this.py pip-2.7 6 localhost:python leo$
可以看到bin目录下已经有了virtualenv为我们准备好的pip和easy_install工具,接下来安装tornado库可以说是毫不费力(当然得有网才行):
localhost:python leo$ helloworld/bin/easy_install tornado Processing tornado Writing /Users/leo/python/tornado/setup.cfg Running setup.py -q bdist_egg --dist-dir /Users/leo/python/tornado/egg-dist-tmp-Q67shc zip_safe flag not set; analyzing archive contents... tornado.autoreload: module references __file__ tornado.simple_httpclient: module references __file__ tornado.testing: module references __file__ tornado.test.httpserver_test: module references __file__ tornado.test.iostream_test: module references __file__ tornado.test.locale_test: module references __file__ tornado.test.options_test: module references __file__ tornado.test.template_test: module references __file__ tornado.test.web_test: module references __file__ Adding tornado 3.3.dev1 to easy-install.pth file Installed /Users/leo/python/helloworld/lib/python2.7/site-packages/tornado-3.3.dev1-py2.7-macosx-10.8-intel.egg 此处省略n字 Installed /Users/leo/python/helloworld/lib/python2.7/site-packages/backports.ssl_match_hostname-3.4.0.2-py2.7.egg Finished processing dependencies for tornado==3.3.dev1 localhost:python leo$
现在,与系统隔离的tornado已经安装完毕了,我们来检查一下lib目录:
1 localhost:python leo$ ls helloworld/lib/python2.7/site-packages/ 2 _markerlib pip-1.4.1-py2.7.egg-info 3 backports.ssl_match_hostname-3.4.0.2-py2.7.egg pkg_resources.py 4 easy-install.pth pkg_resources.pyc 5 easy_install.py setuptools 6 easy_install.pyc setuptools-0.9.8-py2.7.egg-info 7 pip tornado-3.3.dev1-py2.7-macosx-10.8-intel.egg 8 localhost:python leo$
可以看到tornado库已经安装好了。
1.4 运行helloworld
接下来,我们选用tornado官方demos中的helloworld来做例子,运行第一个tornado实例。将demos中的helloworld文件夹拷贝到~/python/helloworld目录中:
1 localhost:python leo$ ls helloworld/ 2 bin helloworld include lib 3 localhost:python leo$
然后,重点的一步,激活虚拟环境,可以看到Terminal提示变成了(helloworld)localhost了:
1 localhost:python leo$ source helloworld/bin/activate 2 (helloworld)localhost:python leo$
接着运行helloworld.py:
1 (helloworld)localhost:python leo$ helloworld/helloworld/helloworld.py
允许联网:
最后在浏览器地址栏中输入:http://127.0.0.1:8888就可以看到helloworld.py成功运行:
如果要退出虚拟环境,Control+z之后deactivate即可。
1 (helloworld)localhost:python leo$ deactivate 2 localhost:python leo$
2.方法二:buildout
zc.buildout同样也能创建独立的Python环境,而且生成的配置文件bootstrap.py能再次生成同样的虚拟运行环境,可谓部署之利器。官方介绍见这。
2.1 安装zc.buildout
zc.buildout的安装依赖于setuptools,Mac里面已经自带了,所以安装比较简单。但buildout的安装方式不止一种,大致可以分为以下几种:
- 下载bootstrap.py文件生成buildout配置环境;
- 安装到系统Python库中,这样可以在Terminal里面直接调用生成新工程;
- 与virtualenv搭配,在virtualenv的虚拟环境中安装;
官网有详细的介绍,这里不赘述,见这。我们这里将buildout直接安装到系统Python库里,安装很简单,pip install zc.buildout即可:
1 localhost:python leo$ pip install zc.buildout 2 Requirement already satisfied (use --upgrade to upgrade): zc.buildout in /usr/local/lib/python2.7/site-packages/zc.buildout-2.2.1-py2.7.egg 3 Requirement already satisfied (use --upgrade to upgrade): setuptools>=0.7 in /usr/local/lib/python2.7/site-packages/setuptools-2.1-py2.7.egg (from zc.buildout) 4 Cleaning up... 5 localhost:python leo$
2.2 生成buildout文件
先新建一个"tornadoBlog"文件夹(之后操作在tornadoBlog文件夹中进行):
1 localhost:python leo$ mkdir tornadoBlog 2 localhost:python leo$ ls tornadoBlog 3 localhost:python leo$
我们选用tornado官方demos中的blog来做例子。将demos中的blog文件夹拷贝到~/python/tornadoBlog目录中:
1 localhost:python leo$ ls tornadoBlog 2 bin buildout.cfg eggs setup.py 3 blog develop-eggs parts 4 localhost:python leo$
切换到~python/tornadoBlog目录中,运行"buildout init"命令:
1 localhost:python leo$ cd tornadoBlog/ 2 localhost:tornadoBlog leo$ buildout init 3 Creating '/Users/leo/python/tornadoBlog/buildout.cfg'. 4 Creating directory '/Users/leo/python/tornadoBlog/bin'. 5 Creating directory '/Users/leo/python/tornadoBlog/parts'. 6 Creating directory '/Users/leo/python/tornadoBlog/eggs'. 7 Creating directory '/Users/leo/python/tornadoBlog/develop-eggs'. 8 Generated script '/Users/leo/python/tornadoBlog/bin/buildout'. 9 localhost:tornadoBlog leo$
可以看到buildout新建了bin, develop-eggs, eggs, parts四个文件夹和一个buildout.cfg配置文件。各个文件的说明参看这里,或者官网。
2.3 配置buildout.cfg
buildout相比virtualenv麻烦的地方就在配置buildout.cfg,我们先用Vim打开看一下:
1 [buildout] 2 parts = 3 ~
我们修改一下:
[buildout] parts = blog develop = . eggs = tornado markdown torndb MySQL-python
[blog] recipe = zc.recipe.egg #interpreter代表新生成解释器的名字,可以是其他名称 interpreter = blogPy eggs = ${buildout:eggs}
因为blog的例子需要用到的Python库除了tornado之外,还需要Markdown, torndb和MySQL-python,所以我们在eggs一栏中加入这三个模块,以便buildout为我们安装。当然我们还需要安装MySQL,如果之前安装了Homebrew,用"brew install mysql"就可以安装MySQL了,如果没有,参看这里。推荐使用Homebrew安装。
保存并退出Vim,在blog目录下新建setup.py文件:
1 localhost:tornadoBlog leo$ ls 2 bin buildout.cfg develop-eggs eggs parts 3 localhost:tornadoBlog leo$ touch setup.py 4 localhost:tornadoBlog leo$ ls 5 bin buildout.cfg develop-eggs eggs parts setup.py 6 localhost:tornadoBlog leo$
修改setup.py:
from setuptools import setup, find_packages setup( name = 'tornado_blog', package_dir = {'':'blog'}, install_requires = ['setuptools', 'markdown', 'torndb', 'MySQL-python'], )
2.4 运行buildout,生成配置环境
现在一切就绪,马上可以调用buildout,生成配置环境了:
1 localhost:tornadoBlog leo$ bin/buildout 2 Develop: '/Users/leo/python/tornadoBlog/.' 3 Getting distribution for 'zc.recipe.egg>=2.0.0a3'. 4 Got zc.recipe.egg 2.0.1. 5 Installing blog. 6 Getting distribution for 'tornado'. 7 8 此处省略n字 9 10 Got MySQL-python 1.2.5. 11 Getting distribution for 'backports.ssl-match-hostname'. 12 zip_safe flag not set; analyzing archive contents... 13 backports.__init__: module references __path__ 14 Got backports.ssl-match-hostname 3.4.0.2. 15 Generated script '/Users/leo/python/tornadoBlog/bin/markdown_py'. 16 Generated interpreter '/Users/leo/python/tornadoBlog/bin/blogPy'. 17 localhost:tornadoBlog leo$
可以看到tornado、markdown等已经配置好(在eggs目录中可以看到新下载的eggs),在bin目录下还有新生成的blogPy解释器脚本,我们配置一下MySQL,接下来就可以用blogPy环境来运行博客了。
2.5 运行Blog
在tornado官方demos中的blog例子中有README文件,里面描述了如何连接MySQL。设置好数据库之后,用blogPy虚拟环境中,即可运行blog.py:
1 localhost:tornadoBlog leo$ bin/blogPy blog/blog.py
用Google账号登陆后就可以添加博客了,效果图如下:
三、总结
通过两个小例子我们练习了用virtualenv和zc.buildout来创建与系统Python库隔离的tornado虚拟环境,总体来讲virtualenv配置要简单一些,安装好之后只需创建隔离的文件夹,然后用pip或easy_install工具下载需要的库运行即可。相比而言,zc.buildout上手要难一些,配置起来也麻烦一点,但有着”配置一次,多处运行“的强大优势,适合大型项目和生产环境中部署,可以说自动化程度更高。