使用setup.py构建轮子时是否可以排除某些文件?

问题描述 投票:0回答:3

我知道您可以使用以下方法排除某些软件包:

packages = find_packages("src", exclude=["test"]),

是否也可以排除单个 python 文件? 我正在构建一个二进制轮,并希望排除我使用自定义函数“cythonized”的某些源文件:

python cythonize bdist_wheel

目前,我在使用自定义脚本构建轮子后删除了所有也包含 .so 库文件的 python 文件,我想使用 setup.py 来完成此操作。

python setuptools
3个回答
27
投票

py-docs 中有一篇模糊的(IMO)文章“如何在包中包含/排除文件”用两个词:使用

find_packages
MANIFEST.in

的组合

要检查本地包中的内容(在发送到 PyPI 之前),请运行

python setup.py sdist
,然后检查
./dist
文件夹的内容(您的包中应该有 tarball)。

我的用例

忽略一个文件

MANIFEST.in
添加到包的根目录,并添加以下行:

exclude .travis.yml
exclude appveyor.yml
exclude data/private/file.env

此文件不会包含在分发包中。

在源头附近进行测试

如果在你的项目中测试文件放在代码附近(换句话说,没有单独的目录

tests
),像这样:

package1
├── src
│   ├── __init__.py
│   ├── __init__test.py
│   ├── mymod.py
│   ├── mymod_test.py
│   ├── typeconv.py
│   └── typeconv_test.py
│
├── LICENSE
└── README.rst

您可以将此行添加到您的

MANIFEST.in
,并且
setuptools
将忽略测试文件:

global-exclude *_test.py

另请参阅


5
投票

如果您使用 exclude_package_data

,您还可以使用 setup() 函数中的 
include_package_data=True
 关键字。

from setuptools import setup

setup(
    name=...,
    ...,
    include_package_data=True,
    exclude_package_data={
        '': 'file_to_exclude_from_any_pkg.c',
        'pkg_name': 'file_to_exclude_from_pkg_name.c',
        ...
    }
)

4
投票

您可以将

setuptools.find_packages()
修订控制插件一起使用,即
setuptools-git

以下是

setup.py
项目设置的一些摘录,用于排除
tests
目录:

from setuptools import setup, find_packages

setup(
    name=...
    ...
    packages=find_packages(exclude=["tests"]),
    setup_requires=[
        'setuptools',
        'setuptools-git',
        'wheel',
    ]

其他类似上面使用的插件可用于 bzrdarcsmonotonemercurial

提示:

不要忘记通过运行来清理构建目录:

python setup.py clean --all bdist_wheel

© www.soinside.com 2019 - 2024. All rights reserved.