distutils
VS setuptools
python打包(packaging)常用的两个工具:distutils
和setuptools
。
distutils
是标准打包工具,被包含在标准库中,可以用作简单的python发布。
setuptools
并不是python标准库的一部分,它的诞生是为了克服distutils
的不足,是distutils
的增强版。
这里只介绍distutils
的使用
当使用distutils时,setup脚本是构建、发布、安装模块的核心。setup脚本的目的是向distutils
描述你的模块发布,以便于在你的模块上操作的各种命令都能正确进行。setup脚本主要包含一个setup()
函数调用,模块开发者提供给distutils
的大多数信息都是通过setup()
函数的关键字参数传递的。
下面是distuitls
模块的setup.py
文件示例:
from distutils.core import setup
setup(name=’Distutils’,
version=’1.0’,
description=’Python Distribution Utilities’,
author=’Greg Ward’,
author_email=’gward@python.net’,
url=’http://www.python.org/sigs/distutils-sig/’,
packages=[’distutils’, ’distutils.command’],
)
test/
├── foobar
│ ├── __init__.py
│ ├── bar.py
│ ├── foo.py
│ └── subfoo
│ ├── __init__.py
│ └── blah.py
└── setup.py
setup.py
书写如下:from distutils.core import setup
setup(name='foobar',
version='1.0',
description='test module',
author='brown',
packages=['foobar', 'foobar.subfoo'],
)
python setup.py install
pip show foobar
有时,我们需要将一些数据文件(数据、配置、日志等)打包进去,这时需要使用package_data
关键字
在上面例子test/foobar
添加data
目录,并在里面创建1.dat
、2.dat
文件,新的目录结构如下:
test/
├── foobar
│ ├── __init__.py
│ ├── bar.py
│ ├── data
│ │ ├── 1.dat
│ │ └── 2.dat
│ ├── foo.py
│ └── subfoo
│ ├── __init__.py
│ └── blah.py
└── setup.py
更改setup.py
为:
from distutils.core import setup
setup(name='foobar',
version='1.0',
description='test module',
author='brown',
packages=['foobar', 'foobar.subfoo'],
package_data={'foobar': ['data/*']},
)
然后执行python setup.py install
安装。
如果你的代码里包含一些C、C++代码,就需要做些额外操作,包括:声明扩展名字、源文件位置、include目录或lib目录。
使用ext_modules
关键字参数,ext_modules
是Extension
实例的集合。
Extension
参数如下:
Extension(’pkg.foo’, [’src/foo.c’], include_dirs=[’include’], libraries=['lib'])
pkg.foo
是扩展包名,它决定了你在python代码中如何引用foo.c
;src/foo.c
是C代码相对位置;include
是C代码依赖的include目录;lib
是C代码依赖的库目录;建立如下目录的文件:
test/
├── cpp
│ ├── bar.c
│ └── foo.c
├── foobar
│ ├── __init__.py
│ └── test.py
└── setup.py
setup.py
文件如下:
from distutils.core import setup, Extension
setup(name='foobar',
version='1.0',
description='test module',
author='brown',
packages=['foobar'],
ext_modules=[
Extension('foobar.foo', ['cpp/foo.c']),
Extension('foobar.bar', ['cpp/bar.c'])
],
)
然后install
Ref
Distributing Python Modules