使用setup.py中的data_files参数在/ usr下分发数据文件


目的

假设您具有以下配置的软件包。

1
2
3
4
5
6
7
8
9
10
$ tree
.
├── config
│   └── myrc
├── mypackage
│   ├── __init__.py
│   ├── lib
│   │   └── libmypackage.so
│   └── mymodule.py
└── setup.py

当我使用python setup.py install等安装此软件包时,我想将libmypackage.so分发到/usr/lib64

方法

使用

setup()data_files自变量。

1
2
3
4
5
6
7
8
9
10
11
from setuptools import setup, find_packages

setup(
    name='mypackage',
    version='0.0.1',
    packages=find_packages(),
    data_files=[
        ('lib64', ['mypackage/lib/libmypackage.so']),
        ('etc', ['config/myrc'])
    ]
)

将"分发目标目录的相对路径"和"要分发的数据文件的setup.py的相对路径"的元组数组传递给

data_files参数。 sys.prefix是分发目标目录的相对路径的标准。换句话说,如果sys.prefix/usr,则libmypackage.so将分发到/usr/lib64

实践

准备以下Dockerfile,以便您可以轻松地在容器中准备新的环境。

1
2
3
4
5
6
7
8
9
10
$ FROM centos:centos7

RUN yum -y update && yum install -y \
    python-devel \
    python-setuptools \
  && easy_install pip \
  && pip install wheel \
  && pip install --upgrade \
    pip \
    setuptools

构建图像。

1
$ docker build -t mypackage .

如果启动

容器并运行python setup.py install_data,则可以看到它已按预期分布。

1
2
3
4
5
$ docker run --rm -it -v ${PWD}:${PWD} -w ${PWD} mypackage /bin/bash
# python setup.py install_data
running install_data
copying mypackage/lib/libmypackage.so -> /usr/lib64
copying config/myrc -> /usr/etc

即使使用

pip install安装wheel,也可以以相同的方式分发它。

1
2
3
4
5
6
7
$ docker run --rm -it -v ${PWD}:${PWD} -w ${PWD} mypackage /bin/bash
# python setup.py bdist_wheel
# pip install dist/mypackage-0.0.1-py2-none-any.whl
# find /usr -name 'libmypackage.so'
/usr/lib64/libmypackage.so
# find /usr -name 'myrc'
/usr/etc/myrc

另一方面,easy_install似乎无法分发。

1
2
3
4
5
$ docker run --rm -it -v ${PWD}:${PWD} -w ${PWD} mypackage /bin/bash
# python setup.py bdist_egg
# easy_install dist/mypackage-0.0.1-py2.7.egg
# find /usr -name 'libmypackage.so'
# find /usr -name 'myrc'

参考

https://docs.python.org/3.6/distutils/setupscript.html#installing-additional-files