转载:http://blog.csdn.net/u011630575/article/details/52940099

buildout简介

Buildout 是一个基于Python的构建工具, Buildout 主要是为了解决两个问题:

  • 中心化的应用组装和部署
  • 重复的从Python软件发布中组装项目

通过一个配置文件 buildout.cfg , 可以从多个部分创建、组装并部署你的应用, 能够构建一个封闭隔离的开发环境.

buildout安装

pip install zc.buildout

buildout使用

  • 创建一个项目目录:
# 目录名可以随便起
$ mkdir decstree
$ cd decstree
  • 初始化项目目录
$ buildout init

查看buildout后的目录结构

├── bin
│ └── buildout
├── buildout.cfg
├── develop-eggs
├── eggs
│ ├── setuptools-18.4-py2.7.egg
│ └── zc.buildout-2.4.6-py2.7.egg
└── parts

配置buildout.cfg文件

[buildout] # 脚本入口
show-picked-versions =true# 显示所安装的版本
parts =app# 相当于入口执行的子函数, 可以设置多个parts [app] # 编写子函数app的逻辑
recipe =zc.recipe.egg# 除了recipe其他都是选项都被认为是recipe的参数
eggs =
pymongo #需要安装的依赖
zone
interpreter =python# 设置要安装的解释器

保存后, 然后执行

$ buildout

buildout的流程, 先调用 [buildout] , 然后发现parts中有app这个子函数, 然后调用app这个子函数的逻辑, app中除了recipe, 其他都被认为是recipe的桉树, 当调用eggs时, buildout发现这些包没有被安装, 于是自动安装包并存放在 eggs目录下

  • buildout会在eggs目录下安装zc.buildout, pymongo
  • 在bin目录下生
    #!/usr/bin/env python
    # -*- coding: utf- -*- fromsetuptoolsimportsetup, find_packages setup(
    name='test',# 此处填写包名
    version='0.0.1',
    author='andrewliu',
    author_email='liu.bin.coder@gmail.com',
    description='This is just a test',
    license='PRIVATE',
    keyword='test',
    packages=find_packages('apps'),
    install_requires=[
    'nose',# 此处填写需要的包
    'pymongo',
    'mysql-python',
    'redis',
    ],
    )

    并修改buildout.cfg文件

    [buildout]
    develop =.
    show-picked-versions =true
    parts =app [app]
    recipe =zc.recipe.egg
    eggs =
    test
    interpreter =python

    再次执行buildout, 会解析setup.py的数据, 并安装 install_requires 中填写的所有包, 并且会通过 packages=find_packages 将当前目录加入到 sys.path

    # 执行buildout可得到下面输出. 会安装buildout和setup.py中的所有包
    [versions]
    MySQL-python =1.2.5
    setuptools =18.5
    zc.buildout =2.4.7
    zc.recipe.egg =2.0.3 # Required by:
    # test==0.0.1
    nose =1.3.7 # Required by:
    # test==0.0.1
    pymongo =3.1 # Required by:
    # test==0.0.1
    redis =2.10.5

    可以看到setup.py中的需求包全被安装了!!!

    验证有效性

    # 创建test文件, 添加代码
    $ vim test_path.py #!/usr/bin/env python
    # -*- coding: utf-8 -*- importsys if__name__ =='__main__':
    print(sys.path)

    现在我们需要使用当前目录bin下的可执行文件python来运行代码

    $ bin/pythontest_path.py

    运行结果如下

    ['/Users/andrew_liu/Zhihu/buildout/buildout', '/Users/andrew_liu/Zhihu/buildout/buildout/eggs/redis-2.10.5-py2.7.egg', '/Users/andrew_liu/Zhihu/buildout/buildout/eggs/MySQL_python-1.2.5-py2.7-macosx-10.10-intel.egg', '/Users/andrew_liu/Zhihu/buildout/buildout/eggs/pymongo-3.1-py2.7-macosx-10.9-intel.egg', '/Users/andrew_liu/Zhihu/buildout/buildout/eggs/nose-1.3.7-py2.7.egg', '/Users/andrew_liu/Zhihu/buildout/buildout/bin', '/Library/Python/2.7/site-packages/distribute-0.6.49-py2.7.egg', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python27.zip', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages', '/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-old', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload', '/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/PyObjC', '/Library/Python/2.7/site-packages']
    • 首先会搜索当前目录下的包
    • 然后会搜索eggs下由buildout安装的包, 可以看出buildout的作用: 优先加载当前目录eggs下的包
    • 最后 才会搜索系统中的包 . 可以看到并没有完全隔离系统中的包.

    生成完全隔离的开发环境

    使用工具:

    • setuptools
    • zc.buildout
    • virtualenv

    创建一个完全隔离的开发环境

    1. 创建一个空的项目文件
    2. 使用virtualenv创建一个虚拟环境
    3. 使用buildout来配置开发的需求.
    4. 结果setup.py集成测试, 开发, 分布于一体.

    成一系列可执行文件, 此时我们如果想解释任何python脚本文件, 都必须执行 bin/python xxx.py (即当前buildout的bin目录中的python解释器)

  • 每个可执行文件中的sys路径都发生改变, 都会优先读取eggs下的三方包

buildout结合setup.py

将setup.py中填写的name项对应的值, 填写到eggs中, 则在buildout会自动加载setup.py中的配置

创建 setup.py 文件

python项目构建工具zc.buildout的更多相关文章

  1. python的构建工具setup.py

    一.构建工具setup.py的应用场景 在安装python的相关模块和库时,我们一般使用“pip install  模块名”或者“python setup.py install”,前者是在线安装,会安 ...

  2. 前端项目构建工具---Grunt

    什么是Grunt? grunt是javascript项目构建工具,在grunt流行之前,前端项目的构建打包大多数使用ant.(ant具体使用 可以google),但ant对于前端而言,存在不友好,执行 ...

  3. Gulp.js - 简单、直观的自动化项目构建工具

    Gulp.js 是一个简单.直观的构建系统.崇尚代码优于配置,使复杂的任务更好管理.通过结合 NodeJS 的数据流的能力,你能够快速构建.通过简单的 API 接口,只需几步就能搭建起自己的自动化项目 ...

  4. grunt项目构建工具

    JS项目构建工具Grunt实践 一:下面来介绍下如何用grunt合并,压缩js文件.    大概步骤有如下:     1. 新建文件夹相对应的项目 比如文件名叫:gruntJs      2. 新建文 ...

  5. Java项目工程化之项目构建工具Maven

    欢迎查看Java开发之上帝之眼系列教程,如果您正在为Java后端庞大的体系所困扰,如果您正在为各种繁出不穷的技术和各种框架所迷茫,那么本系列文章将带您窥探Java庞大的体系.本系列教程希望您能站在上帝 ...

  6. 项目构建工具maven的使用方法

    最近在开发javaweb项目中有用到maven,以前并不是很了解,于是学习了一些相关内容,记之共享. 本篇内容在Windows环境下实施,JDK版本使用的1.7.0_79. 一.maven是什么? 简 ...

  7. 项目构建工具ant的使用

    ant是项目构建工具,以xml文件作为构建文件,在这个xml文件(默认是build.xml,当然也可以取其它名字)里我们可以定义多个目标,用我们期待的方式去构建项目,比如说编译,测试,发邮件等等. a ...

  8. 【项目构建工具】 Gradle笔记1

    一.Gradle简介 Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建开源工具.它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于XM ...

  9. 取代 Maven?这款项目构建工具性能提升 300%

    在 GitHub 上闲逛的时候,发现了一个新的项目:maven-mvnd,持续霸占 GitHub trending 榜单好几天了. maven-mvnd,可以读作 Maven Daemon,译作 Ma ...

随机推荐

  1. The UVALIVE 7716 二维区间第k小

    The UVALIVE 7716 二维区间第k小 /** 题意:给一个n * n的矩阵,有q个查询 每次查询r,c,s,k表示已(r,c)为右上角 大小为s的正方形中 第k小的元素 n <= 2 ...

  2. BZOJ2756 [SCOI2012]奇怪的游戏 【网络流 + 二分】

    题目 Blinker最近喜欢上一个奇怪的游戏. 这个游戏在一个 N*M 的棋盘上玩,每个格子有一个数.每次 Blinker 会选择两个相邻 的格子,并使这两个数都加上 1. 现在 Blinker 想知 ...

  3. 最大异或和(xor)

    最大异或和(xor) 题目描述 给定一个非负整数序列{a},初始长度为N. 有M个操作,有以下两种操作类型: 1.A x:添加操作,表示在序列末尾添加一个数x,序列的长度N+1. 2.Q l r x: ...

  4. HDU 1087 最大上升子序列的和

    Super Jumping! Jumping! Jumping! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 ...

  5. Python学习笔记(Django篇)——1、环境搭建篇(如何在Pycharm中配置Python和Django)

      1.准备好以下东东,并且按照先后顺序进行安装: Python 3.6 (64-bit) Django-1.11.tar.gz pycharm-community-2016.3.2.exe 安装好了 ...

  6. es6+最佳入门实践(2)

    2.解构赋值 2.1.什么是解构赋值? 什么是解构赋值?这里的关键字还是赋值,这是说如何去赋值的问题,这里说的解构可以理解为解散重新构造,所以解构赋值可以理解为解散重新构造后进行赋值,通常是左边一种结 ...

  7. 飞镖(bzoj 2335)

    Description 飞镖是在欧洲颇为流行的一项运动.它的镖盘上分为20个扇形区域,分别标有1到20的分值,每个区域中有单倍.双倍和三倍的区域,打中对应的区域会得到分值乘以倍数所对应的分数.例如打中 ...

  8. dedeCMS常用功能板块记忆

    1.自动调到栏目第一个子栏目 <script> {dede:channel type='son' row='1'} window.location.href='[field:typelin ...

  9. 使用 padding-bottom 设置高度基于宽度的自适应

    我们在做移动端列表,通常会做到图文列表,列表是自适应的.当列表中有图片,图片的宽度是随着列表宽的变化而变化,我们为了在图片宽度变化的时候做到图片的不变形,所有采用以下办法. 本文章只讲语法 html ...

  10. ZOJ3874 Permutation Graph(NTT&&cdq分治)

    最近在看几道整体二分还有cdq分治的东西,突然间想起前几个礼拜的ZOJ题,然后看了一下代码,经过了一些深思熟虑之后,发现自己终于看懂了,下面就用别人的代码来剖析一下整个解题的思路吧,具体的内容我再看看 ...