python 安装库到系统路径以及egg的生成--setuptools 的简单使用

0x00 啰嗦几句

最近突发奇想,想用一个比较酷炫的方式去实现包的引用
于是便有了以下这篇东西,是说遇到的一些坑。
当然少不了的还有安装方式。

0x01 引言

经常接触Python的同学可能会注意到,当需要安装第三方python包时,可能会用到easy_install命令。easy_install是由PEAK(Python Enterprise Application Kit)开发的setuptools包里带的一个命令,它用来安装egg包。egg包是目前最流行的python应用打包部署方式。

虽然现在更加推荐使用 pip 代替 easy_install,但其实,这两者其实算是换汤不换药,除了 pip 能带给我们更加便利和畅快的体验。

现在这里很啰嗦的描述一下,关于 pip 与 easy_install 的区别:

  • bin软件包现在以wheel(.whl文件)的形式分发- 不仅仅在PyPI上,而且在像Christoph Gohlke的Windows扩展包这样的第三方存储库中。pip可以处理wheel而easy_install不能。
  • virtualenv(python3.4 内置此环境,或者可以添加到2.6 + / 3.1 + virtualenv)已经成为一个非常重要和突出的工具(并在官方文档中推荐)。他们包括pip开箱即用,但甚至不能正常工作easy_install。
  • distribute 包含的包 easy_install 不再维护。它的改进 setuptools 已经合并回来了setuptools。试图安装distribute将只是安装setuptools。
  • easy_install 只是准维护工具。
  • 其中还是有不少情况是 pip用于不如easy_install的,比如从源代码安装,如可以pip install .,pip install git+https://。
  • pip来自python.org的官方Python 2.7和3.4+包,并且pip如果从源代码构建,则默认包含引导程序。
  • 关于安装,使用和构建软件包的各种不完整的文档已被Python打包用户指南取代。Python自己的关于安装Python模块的文档现在遵循这个用户指南,并明确地pip称为“首选的安装程序”。
  • 其他新功能仅添加到pip,并永远不会添加到easy_install。例如,pip通过构建一个需求文件,然后在每一边安装一个命令,就可以很容易地克隆你的站点包。或者将需求文件转换为本地版本以用于内部开发。等等。

python 想要将库安装到系统路径中,除了自己手动添加,更加自助化的方式是借助setuptools 来帮助我们进行部署

0x02 setuptools

setuptools是Python distutils增强版的集合,它可以帮助我们更简单的创建和分发Python包,尤其是拥有依赖关系的。用户在使用setuptools创建的包时,并不需要已安装setuptools,只要一个启动模块即可。

功能亮点:

  • 利用EasyInstall自动查找、下载、安装、升级依赖包
  • 创建Python Eggs
  • 包含包目录内的数据文件
  • 自动包含包目录内的所有的包,而不用在setup.py中列举
  • 自动包含包内和发布有关的所有相关文件,而不用创建一个MANIFEST.in文件
  • 自动生成经过包装的脚本或Windows执行文件
  • 支持Pyrex,即在可以setup.py中列出.pyx文件,而最终用户无须安装Pyrex
  • 支持上传到PyPI
  • 可以部署开发模式,使项目在sys.path中
  • 用新命令或setup()参数扩展distutils,为多个项目发布/重用扩展
  • 在项目setup()中简单声明entry points,创建可以自动发现扩展的应用和框架

0x03 创建一个简单的包

在你安装了setuptools 之后,创建一个包相对来说就会变得简单起来了

首先你需要新建一个文件夹helloegg,用来存放对应的包和配置数据

在对应的文件夹中创建setup.py文件,并放入你想打包的文件夹。#在这里我们假定为helloegg文件夹

setup.py 文件中,需要写入一些特定的数据,下面给出一个样例。

from setuptools import setup, find_packages
setup(
    name = 'helloegg',  # 你所填写的包的名称
    version = '0.1', # 版本信息
    keywords = ('keyword'), # 关键字
    description = '这里是描述', # 描述
    license = 'MIT License', # 使用
    url = '这里放的是项目地址',
    author = 'k2yk',
    author_email = 'mzeyong@gmail.com',
    packages = find_packages(exclude=['tests']), # 放包的名字
    include_package_data = True, # 是否包含包的数据
    install_requires = [], # 安装所需的依赖项
)

此时应用的目录结构应该为

你创建的文件夹
|-- helloegg
|   |-- __init__.py
|   |-- helloegg.py
|   |-- test.py
|   `-- ...
`-- setup.py

然后执行

python setup.py build 
python setup.py install

即可。

遇到的一些小坑

在包的引用中,需要把对应的引用的文件夹的名字,改为文件夹的名字


0xFF reference