Skip to content

关于Python的setuptools使用

Published: at 00:00
说明
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 测试