Python setuptools的使用及其动态扩展

    setuptools是目前在Python里面主要应用到的打包,发布模块。setuptools针对Python官方的distutils做了很多针对性的功能增强,比如依赖检查,动态扩展;下面来介绍setuptools的基本使用方法。

   在平时安装Python模块的时候,如果我们选择使用源码下载的时候,我通常会看到在源码包里面有一个setup.py的文件,当我们执行python setup.py install 之后,模块就能够被安装。这个文件就是这个模块的安装脚本,这里也就是主要使用setuptools的地方。

      下面来介绍下利用setuptools进行打包,发布的流程。

       首先,当我们完成了一个Python的第三方模块之后,如果我们想将它打包,发布,首先需要写一个setup.py脚本,下面是一个简单的例子:

from setuptools import setup
setup(    
    name = "PyMySQL",   
    version = version,    
    url = 'https://github.com/petehunt/PyMySQL/',    
    author = 'yutaka.matsubara',    
    author_email = 'yutaka.matsubara@gmail.com',   
    maintainer = 'Pete Hunt',    
    maintainer_email = 'floydophone@gmail.com',    
    description = 'Pure Python MySQL Driver ',    
    license = "MIT",   
    packages = ['pymysql', 'pymysql.constants', 'pymysql.tests'],    
    cmdclass = {'test': TestCommand},)

       其实setup脚本里面就是调用了setuptools里面的setup方法,需要我们组织一些参数,调用一下就可以了。上面的例子有一些参数,主要关注两个:name,表示这个模块的名字;packages,表示这个模块里面需要包含的代码文件。

     在setup脚本完成之后,就可以开始进行打包了,setuptools支持多种格式的打包:

python setup.py bdist  # 在windows下打包成zip压缩包,在Linux下打成tar.gz包
python setup.py bdist_rpm  # 打成rpm包
python setup.py bdist_wininst  # 打成exe文件
    在打包成功之后,就可以发布代码了:

python setup.py register  # 在PyPI上注册模块信息
python setup.py sdist bdist_wininst upload  # 将代码打包并上传

    接下来介绍setuptools里面的动态扩展功能,可以帮助我们在程序中实现动态导入。平时我们使用import来进行模块的静态导入,当你需要动态导入时,可以使用__import__,但是这种用法相对不太规范。在setuptools里面提供了一个很好的动态扩展机制,能更好的帮助我们来进行针对接口的编程。

    为了使用动态扩展机制,我们需要先了解entry_points的用法。entry_points是用在setup脚本里时,调用setup方法的一个参数,一个简单的例子如下:

entry_points={
          'zest.releaser.prereleaser.middle': [
              'datacheck = zest.releaser.prerelease:datacheck',
              ],
          'zest.releaser.releaser.middle': [
              'datacheck = zest.releaser.release:datacheck',
              ],
          'zest.releaser.postreleaser.middle': [
              'datacheck = zest.releaser.postrelease:datacheck',
              ],
          # Documentation generation
          'zest.releaser.prereleaser.before': [
              'datacheck = zest.releaser.utils:prepare_documentation_entrypoint',
              ],
          }
    上面就是一个entry_points的设定方法,它的值由一些键值对组成。键是一个字符串,它制定了一个扩展点的名称。键是一个由字符串组成的list,每个字符串等号的左边定义了这个动态扩展的名称,等号右边定义了扩展对应的函数。也就是说动态扩展是在setup脚本里面定义的,在模块被安装之后,你就可以使用这个动态扩展了。

    下面是使用方法:

    首先我安装了包含以上内容的模块,下面就可以使用动态扩展了。


    上图中写了使用动态扩展的方式,使用pkg_resources模块里面的iter_entry_points方法。这个方法里面可以传两个参数,第一个是在entry_points里面的最外层键值对的键值,第二个参数非必填,可以传这个动态扩展的name,也就是声明动态扩展的字符串里等号前面的部分。通过这个方法返回一个迭代器,所以通过next()方法将里面的对象取出来,然后就可以进行使用了。上图可以看到我们取出的是EntryPoint对象,有两个最重要的属性;一个是name,返回这个动态扩展的名称;再就是load方法,这个方法会把在动态扩展声明里面按等号后面的部分把相应的类或者方法给load出来,如果后面的配置不正确,在调用load的时候会触发异常。

     这就是setuptools里面的动态扩展机制,有的人觉得这样的使用方法还是比较麻烦,针对pkg_resources作了自己的封装,具体可见stevedore项目,该项目的文档地址:http://stevedore.readthedocs.org/en/latest/index.html相信这能更加促进你对python动态扩展机制的了解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值