这篇文章主要介绍了一下 setuptools 是什么,以及它的功能和特点,并且介绍了如何使用它来创建和安装使用自己的包,这篇文章仅仅讲了最基本的功能和用法,一些对于进阶的用法会在下篇文章中进行介绍。
我们通常所知道的 Python 分发工具是 Python disutils, setuptools 可以说是它的增强版,它能帮助我们更好的创建和分发 Python 的包,尤其是具有复杂依赖关系的包。对于开发者来说,能够更好的组织自己项目的分发和发布;对于用户来说,不需要安装 setuputils 也可以使用由它创建的包,只需要一个启动模块即可。
实现这样的的包管理机制主要由两部分构成:
它提供的内容包括:
disutils 仅仅适用于包,它无法定义包之间的依赖关系。但是 setuptools 通过添加一个基本的依赖系统以及许多相关功能,弥补了该缺陷。他还提供了自动包查询程序,用来自动获取包之间的依赖关系,并完成这些包的安装,大大降低了安装各种包的难度,使之更加方便。
setup()
函数中一一列举出来 MANIFEST.in
文件 setup.py
中列出 .pyx
文件,而最终用户无须安装Pyrex setup()
参数扩展distutils,为多个项目发布/重用扩展 setup()
中简单声明 entry points
,创建可以自动发现扩展的应用和框架 sudo apt-get install python-setuptools
安装 wget:
curl -O http://ftp.gnu.org/gnu/wget/wget-1.13.4.tar.gz
tar -xzvf wget-1.13.4.tar.gz
cd wget-1.13.4
./configure
make
sudo make install
安装 setuputils:
wget http://peak.telecommunity.com/dist/ez_setup.py
sudo python ez_setup.py
mkdir demo1
cd demo1
setup.py
文件 from setuptools import setup, find_packages
setup(
name = 'demo1',
version = '0.1',
packages = find_packages(),
)
python setup.py bdist_egg
demo1 |--build | `--bdist.macosx-10.11-intel |--demo1.egg-info | |--dependency_links.txt | |--PKG-INFO | |--SOURCES.txt | `--top_level.txt |--dist | `--demo1-0.1-py2.7.egg `--setup.py
我们看到在 dist
目录中的就是生成的 egg 包,将其解压:
unzip -l demo1-0.1-py2.7.egg Archive: demo1-0.1-py2.7.egg Length Date Time Name -------- ---- ---- ---- 1 03-22-16 23:29 EGG-INFO/dependency_links.txt 177 03-22-16 23:29 EGG-INFO/PKG-INFO 124 03-22-16 23:29 EGG-INFO/SOURCES.txt 1 03-22-16 23:29 EGG-INFO/top_level.txt 1 03-22-16 23:29 EGG-INFO/zip-safe -------- ------- 304 5 files
以上的程序是最简单的一个 setup.py
程序,如果想要发布到 PyPI 就需要参考官方给出的 示例 :
from setuptools import setup, find_packages
setup(
name = "HelloWorld",
version = "0.1",
packages = find_packages(),
scripts = ['say_hello.py'],
# Project uses reStructuredText, so ensure that the docutils get
# installed or upgraded on the target machine
install_requires = ['docutils>=0.3'],
package_data = {
# If any package contains *.txt or *.rst files, include them:
'': ['*.txt', '*.rst'],
# And include any *.msg files found in the 'hello' package, too:
'hello': ['*.msg'],
},
# metadata for upload to PyPI
author = "Me",
author_email = "me@example.com",
description = "This is an Example Package",
license = "PSF",
keywords = "hello world example examples",
url = "http://example.com/HelloWorld/", # project home page, if any
# could also include long_description, download_url, classifiers, etc.
)
我们上边生成的 egg 是一个空的,没有实际的内容,现在我们来添加一些内容:
mkdir test
cd test
__init__.py
,加入如下代码: #-*- coding:utf-8 -*-
def test():
print "hello world!"
if __name__ == '__main__':
test()
python setup.py bdist_egg
查看 egg 包内容:
unzip -l demo1-0.1-py2.7.egg
Archive: demo1-0.1-py2.7.egg
Length Date Time Name
-------- ---- ---- ----
1 03-22-16 23:51 EGG-INFO/dependency_links.txt
177 03-22-16 23:51 EGG-INFO/PKG-INFO
141 03-22-16 23:51 EGG-INFO/SOURCES.txt
5 03-22-16 23:51 EGG-INFO/top_level.txt
1 03-22-16 23:51 EGG-INFO/zip-safe
102 03-22-16 23:48 test/__init__.py
354 03-22-16 23:51 test/__init__.pyc
-------- -------
781 7 files
我们看到其中已经多了 test
目录和 __init__.py
,然后我们就可以尝试 安装一下我们自己的包:
sudo python setup.py install
然后该包就会安装到 Python 的 site-packages
目录下,在我的电脑上为 /Library/Python/2.7/site-packages/demo1-0.1-py2.7.egg
这时我们可以在 Python 终端测试我们的包:
Python 2.7.10 (default, Oct 23 2015, 18:05:06)
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.59.5)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import test
>>> test.test()
hello world!
我们看到我们编写的包已经成功运行!
这篇文章主要介绍了一下 setuptools 是什么,以及它的功能和特点,并且介绍了如何使用它来创建和安装使用自己的包,这篇文章仅仅讲了最基本的功能和用法,一些对于进阶的用法会在下篇文章中进行介绍。
本文的版权归作者罗远航 所有,采用 Attribution-NonCommercial 3.0 License 。任何人可以进行转载、分享,但不可在未经允许的情况下用于商业用途;转载请注明出处。感谢配合!