使用virtualenv或zc.buildout创建Python-tornado分离环境

时间:2022-04-04 17:39:13

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

    允许联网:

使用virtualenv或zc.buildout创建Python-tornado分离环境

    最后在浏览器地址栏中输入:http://127.0.0.1:8888就可以看到helloworld.py成功运行:

使用virtualenv或zc.buildout创建Python-tornado分离环境

    如果要退出虚拟环境,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和zc.buildout来创建与系统Python库隔离的tornado虚拟环境,总体来讲virtualenv配置要简单一些,安装好之后只需创建隔离的文件夹,然后用pip或easy_install工具下载需要的库运行即可。相比而言,zc.buildout上手要难一些,配置起来也麻烦一点,但有着”配置一次,多处运行“的强大优势,适合大型项目和生产环境中部署,可以说自动化程度更高。