48

setup.pyPythonでPythonパッケージを説明する場合、それを含むdistutilsすべてのディレクトリを自動的に取得し__init__.py、それをサブパッケージとして含める方法はありますか?

つまり、構造が次の場合:

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

避けたい:

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

代わりに、次のようにします。

packages = ['mypackage']

initファイルがあるので、などaを自動的に検出します。bありがとう。

4

4 に答える 4

113

次のようなsetuptoolsで使用可能なfind_packages()関数を使用することをお勧めします。

from setuptools import setup, find_packages

そしてします

packages=find_packages()
于 2013-01-17T10:22:49.200 に答える
22

(私が知っている)最も簡単な方法は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 ...
)
于 2012-10-19T02:00:31.853 に答える
20

dm76の回答と同じですが、リポジトリにもテストがあるので、次を使用します。

from setuptools import find_packages

packages=find_packages(exclude=["*.tests", "*.tests.*", "tests.*", "tests"]),
于 2015-05-10T18:08:36.333 に答える
2
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()
...
)
于 2013-05-10T23:51:52.950 に答える