如何使用 setuptools 和 setup.py 从包中排除单个文件
How to exclude a single file from package with setuptools and setup.py
我正在研究 blowdrycss
。存储库是 here。
我希望 blowdrycss_settings.py
的设置文件从 pypi 的最终包中排除。目的是动态构建一个自定义设置文件,该文件将放置在用户的 virtualenv / 项目文件夹中。
在setup.py
中,我有以下内容:
packages=find_packages(exclude=['blowdrycss_settings.py', ]),
我也试过了exclude_package_data:
exclude_package_data={
'': ['blowdrycss_settings.py'],
'': ['blowdrycss/blowdrycss_settings.py'],
'blowdrycss': ['blowdrycss_settings.py'],
},
我然后运行python setup.py sdist bdist
.
但是,当我查看构建文件夹时,我仍然看到 blowdrycss_settings.py
:
- build
- lib
- blowdrycss_settings.py
看来只排除一个文件应该很简单。
如何从分发包中排除 blowdrycss_settings.py
?
这是我的解决方案。
在 blowdrycss
下,我创建了一个名为 settings
的新模块,因此目录结构现在如下所示:
blowdrycss
blowdrycss
settings
blowdrycss_settings.py
基于此 reference,在 setup.py
内部,我有以下内容:
packages=find_packages(exclude=['*.settings', ]),
构建分布:
- 删除
build
、dist
和 .egg-info
文件夹。
- 运行
python setup.py sdist bdist
回想起来,我没能完成我最初想做的事情是件好事。新结构感觉更干净,更模块化。
假设您有一个项目
root
├── setup.py
└── spam
├── __init__.py
├── bacon.py
└── eggs.py
并且您想从包装中排除 spam/eggs.py
:
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}
)
excluded
列表中的 Glob 和多个条目也可以工作,因为它被 fnmatch
使用,因此您可以例如声明
excluded = [
'modules_in_directory/*.py',
'modules_in_subtree/**/*.py',
'path/to/other/module.py'
]
等等
此配方基于 my other answer 问题 setup.py exclude some python files from bdist
。不同之处在于这个配方排除了基于文件 globs 的模块,而另一个排除了基于 qualnames 的模块,例如
excluded = ['spam.*', '*.settings']
将排除 spam
包的所有子模块以及每个包和子包中名为 settings
的所有模块等
从 setuptools
包中删除 单个 或至少几个特定文件的最简单方法就是使用 MANIFEST.in
.例如,在一个包中,您可以通过简单地指定 global-exclude foo.py
来排除所有名称为 foo.py
的文件。如果您只使用 MANIFEST.in
方法,则无需 setuptools
破解或更改包的结构。
请参阅专用的 PyPA article on using MANIFEST.in
了解更多您可以使用的命令。
我正在研究 blowdrycss
。存储库是 here。
我希望 blowdrycss_settings.py
的设置文件从 pypi 的最终包中排除。目的是动态构建一个自定义设置文件,该文件将放置在用户的 virtualenv / 项目文件夹中。
在setup.py
中,我有以下内容:
packages=find_packages(exclude=['blowdrycss_settings.py', ]),
我也试过了exclude_package_data:
exclude_package_data={
'': ['blowdrycss_settings.py'],
'': ['blowdrycss/blowdrycss_settings.py'],
'blowdrycss': ['blowdrycss_settings.py'],
},
我然后运行python setup.py sdist bdist
.
但是,当我查看构建文件夹时,我仍然看到 blowdrycss_settings.py
:
- build
- lib
- blowdrycss_settings.py
看来只排除一个文件应该很简单。
如何从分发包中排除 blowdrycss_settings.py
?
这是我的解决方案。
在 blowdrycss
下,我创建了一个名为 settings
的新模块,因此目录结构现在如下所示:
blowdrycss
blowdrycss
settings
blowdrycss_settings.py
基于此 reference,在 setup.py
内部,我有以下内容:
packages=find_packages(exclude=['*.settings', ]),
构建分布:
- 删除
build
、dist
和.egg-info
文件夹。 - 运行
python setup.py sdist bdist
回想起来,我没能完成我最初想做的事情是件好事。新结构感觉更干净,更模块化。
假设您有一个项目
root
├── setup.py
└── spam
├── __init__.py
├── bacon.py
└── eggs.py
并且您想从包装中排除 spam/eggs.py
:
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}
)
excluded
列表中的 Glob 和多个条目也可以工作,因为它被 fnmatch
使用,因此您可以例如声明
excluded = [
'modules_in_directory/*.py',
'modules_in_subtree/**/*.py',
'path/to/other/module.py'
]
等等
此配方基于 my other answer 问题 setup.py exclude some python files from bdist 。不同之处在于这个配方排除了基于文件 globs 的模块,而另一个排除了基于 qualnames 的模块,例如
excluded = ['spam.*', '*.settings']
将排除 spam
包的所有子模块以及每个包和子包中名为 settings
的所有模块等
从 setuptools
包中删除 单个 或至少几个特定文件的最简单方法就是使用 MANIFEST.in
.例如,在一个包中,您可以通过简单地指定 global-exclude foo.py
来排除所有名称为 foo.py
的文件。如果您只使用 MANIFEST.in
方法,则无需 setuptools
破解或更改包的结构。
请参阅专用的 PyPA article on using MANIFEST.in
了解更多您可以使用的命令。