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

时间:2016-01-31 16:01:23

标签: python package setuptools pypi

我正在研究blowdrycss。存储库是here

我希望将blowdrycss_settings.py的设置文件从pypi的最终包中排除。目的是动态构建一个自定义设置文件,该文件将放置在用户virtualenv / project文件夹中。

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

3 个答案:

答案 0 :(得分:0)

这是我的解决方案。

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

blowdrycss
    blowdrycss
        settings
            blowdrycss_settings.py

根据此reference,在setup.py内,我有以下内容:

packages=find_packages(exclude=['*.settings', ]),   

构建分发:

  1. 删除builddist.egg-info文件夹。
  2. 运行python setup.py sdist bdist
  3. 回想起来,我无法做我最初尝试的事情。新结构感觉更清洁,更模块化。

答案 1 :(得分:0)

想象你有一个项目

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列表中的多个条目也将起作用,因为fnmatch已消耗它们,因此您可以例如声明

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

此食谱基于问题my other answersetup.py exclude some python files from bdist 。区别在于,此配方不包括基于文件glob的模块,而另一个配方则排除基于质量名称的模块,例如

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

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

答案 2 :(得分:0)

从带有 setuptools 的包中删除单个或至少几个特定文件的最简单方法就是使用 MANIFEST.in。例如,在一个包中,您可以通过简单地指定 foo.py 来排除所有文件名 global-exclude foo.py。如果您只使用 setuptools 方法,则无需 MANIFEST.in 破解或更改包的结构。

有关您可以使用的更多命令,请参阅专用的 PyPA article on using MANIFEST.in