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.
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 ...
)
Je recommanderais d'utiliser la fonction find_packages () disponible avec setuptools comme:
from setuptools import setup, find_packages
puis faire
packages=find_packages()
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"]),
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()
...
)