首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用setuptools和setup.py从包中排除单个文件

如何使用setuptools和setup.py从包中排除单个文件
EN

Stack Overflow用户
提问于 2016-01-31 16:01:22
回答 3查看 9.9K关注 0票数 8

我正在研究blowdrycss。存储库是这里

我希望将blowdrycss_settings.py的设置文件排除在pypi上的最终包之外。其目的是动态构建一个自定义设置文件,该文件将放置在用户虚拟/项目文件夹中。

setup.py中,我有以下内容:

代码语言:javascript
运行
复制
packages=find_packages(exclude=['blowdrycss_settings.py', ]),

我也试过数据

代码语言:javascript
运行
复制
exclude_package_data={
    '': ['blowdrycss_settings.py'],
    '': ['blowdrycss/blowdrycss_settings.py'],
    'blowdrycss': ['blowdrycss_settings.py'],
},

然后运行python setup.py sdist bdist

但是,当我查看build文件夹时,仍然会看到blowdrycss_settings.py

代码语言:javascript
运行
复制
- build 
    - lib
        - blowdrycss_settings.py

似乎只排除一个文件应该是很简单的。

如何将blowdrycss_settings.py排除在分布式包之外?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-02-01 01:06:49

这是我的解决办法。

blowdrycss下面,我创建了一个名为settings的新模块,因此目录结构现在如下所示:

代码语言:javascript
运行
复制
blowdrycss
    blowdrycss
        settings
            blowdrycss_settings.py

基于这个参考文献,在setup.py内部有以下内容:

代码语言:javascript
运行
复制
packages=find_packages(exclude=['*.settings', ]),   

要构建发行版:

  1. 删除builddist.egg-info文件夹。
  2. 运行python setup.py sdist bdist

回想起来,我无法做我最初试图做的事情,这是很好的。新的结构感觉更干净,更模块化。

票数 1
EN

Stack Overflow用户

发布于 2019-05-08 15:25:18

想象一下你有一个项目

代码语言:javascript
运行
复制
root
├── setup.py
└── spam
    ├── __init__.py
    ├── bacon.py
    └── eggs.py

您希望将spam/eggs.py排除在打包之外:

代码语言:javascript
运行
复制
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列表中的全局和多个条目也会工作,因为它是由fnmatch使用的,所以您可以声明。

代码语言:javascript
运行
复制
excluded = [
    'modules_in_directory/*.py',
    'modules_in_subtree/**/*.py',
    'path/to/other/module.py'
]

等。

这个食谱是基于我的另一个答案的问题setup.py从bdist中排除了一些python文件。。不同之处在于,这个配方排除了基于文件全局的模块,而另一个则排除了基于质量的模块,例如

代码语言:javascript
运行
复制
excluded = ['spam.*', '*.settings']

将排除spam包的所有子模块以及每个包和子包中名为settings的所有模块。

票数 5
EN

Stack Overflow用户

发布于 2021-06-19 02:59:21

从带有setuptools的包中删除单个或至少几个特定文件的最简单方法就是使用MANIFEST.in。例如,在包中,只需指定foo.py,就可以排除所有文件名为global-exclude foo.py。如果您只使用setuptools方法,则不需要进行MANIFEST.in黑客攻击或更改包的结构。

有关可以使用的更多命令,请参见专用MANIFEST.in

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35115892

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档