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

nu *_*est 6 python setuptools package pypi

我正在工作blowdrycss。存储库在这里

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

setup.py,我有以下内容:

packages=find_packages(exclude=['blowdrycss_settings.py', ]),
Run Code Online (Sandbox Code Playgroud)

我也试过exclude_package_data

exclude_package_data={
    '': ['blowdrycss_settings.py'],
    '': ['blowdrycss/blowdrycss_settings.py'],
    'blowdrycss': ['blowdrycss_settings.py'],
},
Run Code Online (Sandbox Code Playgroud)

我然后跑python setup.py sdist bdist

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

- build 
    - lib
        - blowdrycss_settings.py
Run Code Online (Sandbox Code Playgroud)

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

如何blowdrycss_settings.py从分布式包中排除?

hoe*_*ing 5

假设你有一个项目

\n\n
root\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 setup.py\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 spam\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 bacon.py\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 eggs.py\n
Run Code Online (Sandbox Code Playgroud)\n\n

并且您想spam/eggs.py从包装中排除:

\n\n
import fnmatch\nfrom setuptools import find_packages, setup\nfrom setuptools.command.build_py import build_py as build_py_orig\n\n\nexcluded = [\'spam/eggs.py\']\n\n\nclass build_py(build_py_orig):\n    def find_package_modules(self, package, package_dir):\n        modules = super().find_package_modules(package, package_dir)\n        return [\n            (pkg, mod, file)\n            for (pkg, mod, file) in modules\n            if not any(fnmatch.fnmatchcase(file, pat=pattern) for pattern in excluded)\n        ]\n\n\nsetup(\n    packages=find_packages(),\n    cmdclass={\'build_py\': build_py}\n)\n
Run Code Online (Sandbox Code Playgroud)\n\n

列表中的全局变量和多个条目excluded也可以工作,因为它被 消耗fnmatch,所以你可以声明

\n\n
excluded = [\n    \'modules_in_directory/*.py\',\n    \'modules_in_subtree/**/*.py\',\n    \'path/to/other/module.py\'\n]\n
Run Code Online (Sandbox Code Playgroud)\n\n

ETC。

\n\n

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

\n\n
excluded = [\'spam.*\', \'*.settings\']\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n


nu *_*est 1

这是我的解决方案。

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

blowdrycss
    blowdrycss
        settings
            blowdrycss_settings.py
Run Code Online (Sandbox Code Playgroud)

根据此参考,我的内部setup.py有以下内容:

packages=find_packages(exclude=['*.settings', ]),   
Run Code Online (Sandbox Code Playgroud)

构建发行版:

  1. 删除builddist、 和.egg-info文件夹。
  2. 跑步python setup.py sdist bdist

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