make distutils dans Python trouve automatiquement les paquets

Lorsque vous décrivez un paquet Python dans setup.py dans distutils dans Python, y a-t-il un moyen de le faire pour obtenir automatiquement tous les répertoires qui __init__.py un __init__.py et les inclure en tant que sous-paquet?

c’est à dire si la structure est:

 mypackage/__init__.py mypackage/a/__init__.py mypackage/b/__init__.py 

Je veux éviter de faire:

 packages = ['mypackage', 'mypackage.a', 'mypackage.b'] 

et au lieu de cela juste faire:

 packages = ['mypackage'] 

et le faire trouver automatiquement des choses comme a et b car ils ont un fichier init. Merci.

    Le moyen le plus simple (que je connaisse) est d’utiliser pkgutil.walk_packages pour générer les paquets:

     from distutils.core import setup from pkgutil import walk_packages import mypackage def find_packages(path=__path__, prefix=""): yield prefix prefix = prefix + "." for _, name, ispkg in walk_packages(path, prefix): if ispkg: yield name setup( # ... snip ... packages = list(find_packages(mypackage.__path__, mypackage.__name__)), # ... snip ... ) 

    Je recommande d’utiliser la fonction find_packages () disponible avec les setuptools tels que:

     from setuptools import setup, find_packages 

    et ensuite faire

     packages=find_packages() 

    Identique à la réponse de dm76, juste que j’ai aussi des tests dans mon repo, donc j’utilise:

     from setuptools import find_packages packages=find_packages(exclude=["*.tests", "*.tests.*", "tests.*", "tests"]), 
     import re, os def find_packages(path='.'): ret = [] for root, dirs, files in os.walk(path): if '__init__.py' in files: ret.append(re.sub('^[^A-z0-9_]+', '', root.replace('/', '.'))) return ret setup( ... packages = find_packages() ... )