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

Posted

技术标签:

【中文标题】从 python bdist_egg 或 bdist_wheel 中排除单个源文件【英文标题】:Exclude single source file from python bdist_egg or bdist_wheel 【发布时间】:2018-11-03 11:42:55 【问题描述】:

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

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

我已经完成了使用 egg 命令仅发送二进制文件。

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

编辑项目结构:

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

感谢您的帮助!

【问题讨论】:

排除单个模块很棘手。你能提供你的项目结构吗? 您好,感谢您的帮助。我更新了上面的帖子。 我已经用比我之前建议的更好的解决方案更新了答案;如果您仍然感兴趣,请查看! 【参考方案1】:

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

更新:

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

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-conform 解决方案。它还可以通过通配符匹配排除多个模块,例如

exclude = ['src.file*']

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

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,
)

【讨论】:

以上是关于从 python bdist_egg 或 bdist_wheel 中排除单个源文件的主要内容,如果未能解决你的问题,请参考以下文章

安装Python的psutil模块时报错:error: command 'gcc' failed with exit status 1

Python 绑定:从 Python 调用 C 或 C++

Python 绑定:从 Python 调用 C 或 C++

从 AJAX 或 JQuery 运行 Python 脚本

使用 cmd.exe 或 PowerShell 或 Python 从 Windows 命名管道中读取

如何使用 Python 或 Tesseract OCR 从输入图像中检测语言或脚本?