什么是 distutils 等同于 setuptools 的“find_packages”? (python)

What's distutils' equivalent of setuptools' `find_packages`? (python)

我有一个 setup.py 文件来检查用户是否有 setuptools,如果他没有,那么我将被迫使用 distutils。问题是,为了确保安装了子模块,我使用 setuptools' find package:

from setuptools import setup, find_packages
packages = find_packages()

然后从那里继续。

但是,我不确定如何用 distutils 做到这一点。是否有等效的功能,或者我是否必须手动查找其中包含 __init__.py 的子目录?如果是这样,我可以接受 setuptools 安装我的包而忘记 distutils 吗?

干杯。

使用setuptools完全可以接受; PyPI 上的绝大多数包都已经这样做了。

如果您想重新发明 find_packages() 轮子,那么是的,寻找其中包含 __init__.py 文件的目录。这就是 setuptools.PackageFinder class 所做的。一个简化的重新实现是:

import os
from distutils.util import convert_path


def find_packages(base_path):
    base_path = convert_path(base_path)
    found = []
    for root, dirs, files in os.walk(base_path, followlinks=True):
        dirs[:] = [d for d in dirs if d[0] != '.' and d not in ('ez_setup', '__pycache__')]
        relpath = os.path.relpath(root, base_path)
        parent = relpath.replace(os.sep, '.').lstrip('.')
        if relpath != '.' and parent not in found:
            # foo.bar package but no foo package, skip
            continue
        for dir in dirs:
            if os.path.isfile(os.path.join(root, dir, '__init__.py')):
                package = '.'.join((parent, dir)) if parent else dir
                found.append(package)
    return found

这会忽略 setuptools.find_packages()includeexclude 参数。