从python bdist_egg或bdist_wheel中排除单个源文件

时间:2018-05-24 09:44:10

标签: setuptools python-wheel egg

背景:我有一个负责安全性的源文件。有魔术键和特定算法。

是否可以从python egg或wheel包中删除这个单个源文件?

我已经完成了只使用egg命令运送binarys。

python setup.py bdist_egg --exclude-source-files

编辑项目结构:

├── setup.py
├── src
|   ├── __init__.py
|   ├── file1.py
|   ├── file2.py
|   ├── file_to_exclude.py

感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

不幸的是,distutilssetuptools都没有提供排除单个模块的可能性,因此您必须解决这个问题。

更新

我已经描述了一个更好的解决方案here,它模仿setuptools中的包排除find_packages()。您必须在设置脚本中覆盖可以接受排除模式列表的build_py命令,与exclude中的find_packages列表相同。在你的情况下,它将是:

import fnmatch
from setuptools import find_packages, setup
from setuptools.command.build_py import build_py as build_py_orig


exclude = ['src.file_to_exclude']


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(pkg + '.' + mod, pat=pattern)
                for pattern in exclude)]


setup(
    ...,
    packages=find_packages(),
    cmdclass={'build_py': build_py},
)

我发现这是一个比下面更强大且distutils一致的解决方案。它还允许通过通配符匹配排除多个模块,例如

exclude = ['src.file*']

将排除以file包中的src开头的所有模块,或

exclude = ['*.file1']

将在所有套餐中排除file1.py

原始答案

将模块排除在单独的包中

您可以使用setuptools可以排除包(包含__init__.py文件的目录)这一事实,但需要进行一些重构。创建package_to_exclude,在其中放置file_to_exclude.py并修复所有可能的导入错误:

project
├── setup.py
└── src
     ├── __init__.py
     ├── file1.py
     ├── file2.py
     └── package_to_exclude
          ├── __init__.py
          └── file_to_exclude.py

现在您可以在设置脚本中排除package_to_exclude

from setuptools import find_packages, setup

setup(
    ...,
    packages=find_packages(exclude=['src.package_to_exclude'])
)

排除包,添加要通过py_modules

包含的模块

如果您不能或不想在单独的软件包中移动模块,则可以排除src软件包并添加除src之外的file_to_exclude中的所有模块py_modules。例如:

import os
from setuptools import find_packages, setup

excluded_files = ['file_to_exclude.py']
included_modules = ['src.' + os.path.splitext(f)[0]
                    for f in os.listdir('src')
                    if f not in excluded_files]

setup(
    ...,
    packages=find_packages(exclude=['src']),
    py_modules=included_modules,
)