How to exclude a single file from package with setuptools and setup.py

前端 未结 2 2068
悲哀的现实
悲哀的现实 2021-01-06 02:09

I am working on blowdrycss. The repository is here.

I want the settings file for blowdrycss_settings.py to be excluded from the final pack

2条回答
  •  萌比男神i
    2021-01-06 02:37

    Imagine you have a project

    root
    ├── setup.py
    └── spam
        ├── __init__.py
        ├── bacon.py
        └── eggs.py
    

    and you want to exclude spam/eggs.py from packaging:

    import fnmatch
    from setuptools import find_packages, setup
    from setuptools.command.build_py import build_py as build_py_orig
    
    
    excluded = ['spam/eggs.py']
    
    
    class build_py(build_py_orig):
        def find_package_modules(self, package, package_dir):
            modules = super().find_package_modules(package, package_dir)
            return [
                (pkg, mod, file)
                for (pkg, mod, file) in modules
                if not any(fnmatch.fnmatchcase(file, pat=pattern) for pattern in excluded)
            ]
    
    
    setup(
        packages=find_packages(),
        cmdclass={'build_py': build_py}
    )
    

    Globs and multiple entries in excluded list will work too because it is consumed by fnmatch, so you can e.g. declare

    excluded = [
        'modules_in_directory/*.py',
        'modules_in_subtree/**/*.py',
        'path/to/other/module.py'
    ]
    

    etc.

    This recipe is based on my other answer to the question setup.py exclude some python files from bdist . The difference is that this recipe excludes modules based on file globs, while the other one excludes modules based on qualnames, for example

    excluded = ['spam.*', '*.settings']
    

    will exclude all submodules of spam package and all modules named settings in every package and subpackage etc.

提交回复
热议问题