web-dev-qa-db-fra.com

faire des distutils dans Python trouve automatiquement les paquets

Lors de la description d'un package python dans setup.py dans distutils dans Python, existe-t-il un moyen de faire en sorte que tous les répertoires qui ont un __init__.py dedans et l'inclure comme 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, faites simplement:

packages = ['mypackage']

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

46
user248237

La façon la plus simple (à ma connaissance) est d'utiliser pkgutil.walk_packages pour produire les packages:

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 ...
)
20
Sean Vieira

Je recommanderais d'utiliser la fonction find_packages () disponible avec setuptools comme:

from setuptools import setup, find_packages

puis faire

packages=find_packages()
112
dm76

Identique à la réponse 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"]),
19
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()
...
)
2
Brian Dilley