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

问题描述 投票:0回答:4

我正在努力

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

python package setuptools pypi
4个回答
5
投票

想象你有一个项目

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'
]

等等

这个食谱基于我对问题的其他答案setup.py从bdist中排除一些python文件 。不同之处在于,这个配方排除了基于文件 glob 的模块,而另一个配方则排除了基于限定名的模块,例如

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

将排除

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


1
投票

这是我的解决方案。

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

blowdrycss
    blowdrycss
        settings
            blowdrycss_settings.py

基于此参考,在

setup.py
内部我有以下内容:

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

构建发行版:

  1. 删除
    build
    dist
    .egg-info
    文件夹。
  2. 奔跑
    python setup.py sdist bdist

回想起来,我没能做到我最初尝试的事情是件好事。新的结构感觉更干净并且更加模块化。


1
投票

使用 setuptools 从包中删除

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

请参阅有关使用 MANIFEST.in

 的专用 PyPA 文章,了解更多可以使用的命令。


0
投票

跟进清单答案,这就是我们的清单文件的样子:

recursive-include src/MyPackage *
recursive-exclude src/MyPackage *.pyc
recursive-exclude src/MyPackage/excluded-directory *.py
© www.soinside.com 2019 - 2024. All rights reserved.