说明
package url: https://pypi.python.org/pypi/setuptools
很多python的包安装都用到了setuptools,今天重新来认识下。
setuptools可以让我们将自己的库包装成一个egg的包,egg 相对于 Python 类似于 jar 相对于 Java,
利用easy_install 或 pip 可以将egg安装到site-package下。 pip 是包管理工具,类似于 Ruby 的
Gem, PHP 的 Composer, Perl 的 CPAN.
setuptools是PEAK的一个项目,相当于 Python distutils的加强版, 能让我们可以更容易的创建和分
发Python包。setuptools的在线文档: http://peak.telecommunity.com/DevCenter/setuptools
初步使用
创建个第一个项目,创建个setup.py文件
setup.py 的代码如下:
import setuptools
setuptools.setup(
name='demo1',
version='1.0.0'
)
执行命令生成egg
python setup.py bdist_egg
生成的文件详细如下:
.
|-- build
| `-- bdist.macosx-10.8-x86_64
|-- dist
| `-- first_demo-1.0.0-py2.7.egg
|-- first_demo.egg-info
| |-- PKG-INFO
| |-- SOURCES.txt
| |-- dependency_links.txt
| `-- top_level.txt
`-- setup.py
dist目录下生成的就是egg包
使用find_packages
增加一个test 包, 和work.py文件, 最后的文件详情如下:
.
|-- setup.py
`-- test
|-- __init__.py
`-- work.py
work.py的代码如下:
# -*- coding: utf-8 -*-
__author__ = 'nate <[email protected]>'
def test():
print 'this is test'
return
if __name__ == '__main__':
test()
修改setup.py, 增加packages, 如下:
import setuptools
setuptools.setup(
name='demo1',
version='1.0.0',
packages=setuptools.find_packages()
)
find_packages() 会自动搜索所有的Python包(带有__init__.py文件的目录)
执行命令生成egg, unzip egg文件:
$ unzip first_demo-1.0.0-py2.7.egg
Archive: first_demo-1.0.0-py2.7.egg
inflating: EGG-INFO/dependency_links.txt
inflating: EGG-INFO/PKG-INFO
inflating: EGG-INFO/SOURCES.txt
inflating: EGG-INFO/top_level.txt
inflating: EGG-INFO/zip-safe
inflating: test/init.py
inflating: test/init.pyc
inflating: test/work.py
inflating: test/work.pyc
执行命令安装到site-packages目录 python setup.py install tree /usr/local/lib/python2.7/site-packages/demo1-1.0.0-py2.7.egg 打开ipython测试我们的包 from test import work work.test()
使用entry_points
entry_points可以定义通过setuptools注册的外部可以直接调用的接口。
增加一个plugin的Python包,并在plugin包增加plugin1.py文件。
plugin1的代码如下:
# -*- coding: utf-8 -*-
def main():
print 'this is plugin1'
修改setup.py:
import setuptools
setuptools.setup(
name='demo1',
version='1.0.0',
author='nate',
author_email='nate_yhz at outlook.com',
description='just for test',
packages=setuptools.find_packages(),
entry_points={
'my_group': [
'my_plugin = plugin.plugin1:main'
]
},
)
生成egg并安装
python setup.py bdist_egg
python setup.py install
使用stevedore包动态加载my_plugin, 创建test.pyt用于测试:
# -*- coding: utf-8 -*-
from stevedore import driver
def test():
try:
group = 'my_group'
name = 'my_plugin'
mgr = driver.DriverManager(group,
name,
)
return mgr.driver
except ImportError as e:
print 'Unable to load plugin'
if __name__ == '__main__':
mgr = test()
mgr()
使用console_scripts
每个console_scripts表示可执行脚本会被生成并安装,我们可以直接执行。
增加一个cmd的Python包,并创建个cmd1py.py文件。
cmd.py的代码如下:
# -*- coding: utf-8 -*-
def test():
print 'this is test for console_script'
if __name__ == '__main__':
test()
修改setup.py: import setuptools
setuptools.setup(
name='demo1',
version='1.0.0',
author='nate',
author_email='nate_yhz at outlook.com',
description='just for test',
packages=setuptools.find_packages(),
entry_points={
'my_group': [
'my_plugin = plugin.plugin1:main'
],
'console_scripts': [
’nate-cmd = cmd.cmd1:test’ ] }, ) 生成egg并安装 python setup.py bdist_egg python setup.py install 在终端直接扫行 nate-cmd 测试