python打包(packaging)常用的两个工具:distutils和setuptools。
distutils是标准打包工具,被包含在标准库中,可以用作简单的python发布。
setuptools并不是python标准库的一部分,它的诞生是为了克服distutils的不足,是distutils的增强版。
这里只介绍distutils的使用
2. distutils基本使用
(1)简介
当使用distutils时,setup脚本是构建、发布、安装模块的核心。setup脚本的目的是向distutils描述你的模块发布,以便于在你的模块上操作的各种命令都能正确进行。setup脚本主要包含一个setup()函数调用,模块开发者提供给distutils的大多数信息都是通过setup()函数的关键字参数传递的。
下面是distuitls模块的setup.py文件示例:
1 from distutils.core importsetup2
3 setup(name=’Distutils’,4 version=’1.0’,5 description=’Python Distribution Utilities’,6 author=’Greg Ward’,7 author_email=’gward@python.net’,8 url=’http://www.python.org/sigs/distutils-sig/’,9 packages=[’distutils’, ’distutils.command’],
(2)一个例子
构建如下目录结构:
test/
├── foobar
│ ├── __init__.py
│ ├── bar.py
│ ├── foo.py
│ └── subfoo
│ ├── __init__.py
│ └── blah.py
└── setup.py
setup.py书写如下:
1 from distutils.core importsetup2 setup(name='foobar',3 version='1.0',4 description='test module',5 author='brown',6 packages=['foobar', 'foobar.subfoo'],7 )
在test目录一级,执行install命令
python setup.py install
使用pip show查看刚刚安装的包
pip show foobar
3. 安装package data
有时,我们需要将一些数据文件(数据、配置、日志等)打包进去,这时需要使用package_data关键字
(1)例子
在上面例子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为:
1 from distutils.core importsetup2
3 setup(name='foobar',4 version='1.0',5 description='test module',6 author='brown',7 packages=['foobar', 'foobar.subfoo'],8 package_data={'foobar': ['data/*']},9 )
然后执行python setup.py install安装。
4. 扩展模块
如果你的代码里包含一些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代码依赖的库目录;
(1)例子
建立如下目录的文件:
test/
├── cpp
│ ├── bar.c
│ └── foo.c
├── foobar
│ ├── __init__.py
│ └── test.py
└── setup.py
setup.py文件如下:
1 from distutils.core importsetup, Extension2
3 setup(name='foobar',4 version='1.0',5 description='test module',6 author='brown',7 packages=['foobar'],8 ext_modules=[9 Extension('foobar.foo', ['cpp/foo.c']),10 Extension('foobar.bar', ['cpp/bar.c'])11 ],12 )
然后install
Ref