【问题标题】:setup.py exclude some python files from bdistsetup.py 从 bdist 中排除一些 python 文件
【发布时间】:2023-03-14 05:56:02
【问题描述】:

我有一个具有这种架构的 django 项目:

  • setup.py
  • 项目/
    • __init__.py
    • manage.py
    • 设置/
      • __init__.py
      • base.py
      • dev.py
    • 网址/
      • __init__.py
      • base.py
      • dev.py

我想在没有我的“dev.py”文件的情况下将它部署在 .egg 中。我尝试了不同的方法:首先,使用

find_packages(exclude=['*.dev','dev'])

,然后使用 MANIFEST.in,其中包含:

global-exclude dev.py

当我执行 sdist 时,第二种解决方案似乎有效 - 安装时出现此警告:

warning: no previously-included files matching 'dev.py' found anywhere in distribution 

,但不适用于 bdist-egg。

这是我 setup.py 的一部分:

from setuptools import setup, find_packages
project import VERSION


packages = [
        'project',
        'project.settings',
        'project.urls',
]

setup(name='project',
  version=VERSION,
  package_dir = {'project' : 'project'},
  description  = 'My Project',
  author       = 'Simon Urli',
  author_email = '',
  url = '',
  packages = packages, #find_packages('project',exclude=['*.dev', 'dev']),
)

请注意,我使用的是 python 2.6.6,也许这很重要。 知道如何正确创建我的鸡蛋,不包括开发文件吗?

【问题讨论】:

    标签: python django deployment installation setuptools


    【解决方案1】:

    我最近遇到了同样的问题(尽管我不得不建造一个轮子而不是一个鸡蛋),该解决方案对于 bdist_eggbdist_wheel 都适用。您必须在build_py 中覆盖find_package_modules 方法:

    import fnmatch
    from setuptools import find_packages, setup
    from setuptools.command.build_py import build_py as build_py_orig
    
    
    exclude = ['*.dev']
    
    
    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},
    )
    

    在此示例中,所有包中名为 dev 的模块都将从构建中排除。

    如您所见,没有必要在find_packages() 中使用排除项,因为您仍然需要包含所有包,而是过滤每个包中的模块文件。 build_py 类非常通用,如果需要重用,可以在单独的库中重构;唯一特定于项目的东西是排除模式列表。

    【讨论】:

    • 感谢您的回答。因为我的问题是 7 年前的问题,所以我不再处理这个问题了。很抱歉,我没有将其标记为答案,因为我不会检查它。如果有人确认它有效,我会的;)
    • 嘿,没问题!我自己在寻找答案时发现了这个问题,所以想分享我的解决方案,因为这个问题很受欢迎;也许有一天它会帮助某人。
    • super() 在 python 2.7 中不起作用,我在实例化父类并使其工作的所有尝试都失败了。知道如何在 2.7 中通过向 super() 提供参数来做到这一点吗?
    • @Fizi super(build_py, self).find_package_modules(...) 应该这样做。
    • 它没有。我得到了一个 TypeError: __init__() 正好需要 2 个参数(给定 3 个)。经过大量的处理后,我遇到了 NewType 类与 OldType 类的问题,它期望类型但得到了一个 classObj。最终对我有用的是 build_py_orig(Distribution()).find_package_modules(package, package_dir)
    【解决方案2】:
    def without_app(item):
        # http://docs.python.org/release/2.2.1/lib/string-methods.html
        return not bool(item.find('app_name') + 1) 
    
    # help(filter) - use in command line to read the docstring
    packages = filter(without_app, find_packages()) 
    

    【讨论】:

      猜你喜欢
      • 2018-11-25
      • 2020-12-22
      • 1970-01-01
      • 1970-01-01
      • 2016-02-29
      • 1970-01-01
      • 2020-04-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多