web-dev-qa-db-ja.com

distutils in Pythonパッケージを自動的に見つける

Pythonのdistutilssetup.pyのpythonパッケージ)を記述するときに、__init__.pyを持つすべてのディレクトリを自動的に取得する方法はありますかその中にサブパッケージとして含めますか?

すなわち、構造が次の場合:

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

私はすることを避けたい:

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

代わりに次のようにします:

packages = ['mypackage']

また、abなどの初期化ファイルがあるため、自動的に検出するようにします。ありがとう。

46
user248237

(私が知っている)最も簡単な方法は pkgutil.walk_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

setuptools で利用可能なfind_packages()関数を使用することをお勧めします:

from setuptools import setup, find_packages

してから

packages=find_packages()
112
dm76

Dm76の回答と同じですが、レポジトリにもテストがあるため、以下を使用します。

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