python代码打包发布

1. distutils VS setuptools

python打包(packaging)常用的两个工具:distutilssetuptools

  • distutils是标准打包工具,被包含在标准库中,可以用作简单的python发布。

  • setuptools并不是python标准库的一部分,它的诞生是为了克服distutils的不足,是distutils的增强版。

这里只介绍distutils的使用

2. distutils基本使用

(1)简介

当使用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’],
)

(2)一个例子

构建如下目录结构:

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'],
      )

在test目录一级,执行install命令

python setup.py install

使用pip show查看刚刚安装的包

pip show foobar

3. 安装package data

有时,我们需要将一些数据文件(数据、配置、日志等)打包进去,这时需要使用package_data关键字

(1)例子

在上面例子test/foobar添加data目录,并在里面创建1.dat2.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安装。

4. 扩展模块

如果你的代码里包含一些C、C++代码,就需要做些额外操作,包括:声明扩展名字、源文件位置、include目录或lib目录。

使用ext_modules关键字参数,ext_modulesExtension实例的集合。

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文件如下:

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

你可能感兴趣的:(python)