How To Exclude A Single File From Package With Setuptools And Setup.py
Solution 1:
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']
classbuild_py(build_py_orig):
deffind_package_modules(self, package, package_dir):
modules = super().find_package_modules(package, package_dir)
return [
(pkg, mod, file)
for (pkg, mod, file) in modules
ifnotany(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.
Solution 2:
Here is my solution.
Underneath of blowdrycss
, I created a new module called settings
so the directory structure now looks like this:
blowdrycss
blowdrycss
settings
blowdrycss_settings.py
Based on this reference, inside of setup.py
I have the following:
packages=find_packages(exclude=['*.settings', ]),
To build the distribution:
- Delete the
build
,dist
, and.egg-info
folders. - Run
python setup.py sdist bdist
In retrospect, it is good that I was unable to do what I was originally attempting. The new structure feels cleaner and is more modular.
Solution 3:
The easiest way to remove a single, or at least a few specific files, from a package with setuptools
is just to use the MANIFEST.in
. For example, in a package you can exclude all files name foo.py
by simply specifying global-exclude foo.py
. There's no need for setuptools
hacking or changing the structure of your package if you just use the MANIFEST.in
method.
See the dedicated PyPA article on using MANIFEST.in
for more commands you can use.
Post a Comment for "How To Exclude A Single File From Package With Setuptools And Setup.py"