在setup.py中排除某些Python文件不打包到bdist中

15 投票
2 回答
5391 浏览
提问于 2025-04-16 17:30

我有一个django项目,结构大概是这样的:

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

我想把它打包成一个.egg文件,但不想包含我的'dev.py'文件。我尝试了几种方法:首先,用了一个

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,可能这也有影响。有没有什么办法可以正确地创建我的egg文件,同时排除开发文件呢?

2 个回答

-1
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()) 

当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。

8

我最近也遇到了同样的问题(不过我需要构建的是一个轮子而不是蛋),解决方法对于 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 这个类基本上是通用的,如果你需要重复使用,可以将其重构到一个单独的库中;唯一与项目相关的就是排除模式的列表。

撰写回答