使用Python中的distutils自动查找包

46 python distutils setup.py

当在描述一个Python包setup.pydistutilsPython中,是有办法使它所以自动获得每一个有一个目录__init__.py中,并包含一个子包?

即如果结构是:

mypackage/__init__.py
mypackage/a/__init__.py
mypackage/b/__init__.py
Run Code Online (Sandbox Code Playgroud)

我想避免这样做:

packages = ['mypackage', 'mypackage.a', 'mypackage.b']
Run Code Online (Sandbox Code Playgroud)

而只是做:

packages = ['mypackage']
Run Code Online (Sandbox Code Playgroud)

让它自动找到类似的东西a,b因为它们有一个init文件.谢谢.

dm7*_*m76 111

我会建议使用find_packages()函数可用setuptools的,例如:

from setuptools import setup, find_packages
Run Code Online (Sandbox Code Playgroud)

然后呢

packages=find_packages()
Run Code Online (Sandbox Code Playgroud)

  • 请注意,`find_packages()`没有找到> 3.3风格的no-__init__.py包.有关此问题的门票是https://bitbucket.org/pypa/setuptools/issue/97.所以现在,有必要在`find_packages()`auto collection的包中添加`__init __.py`文件,或者你必须在`packages`中明确命名它们. (4认同)

Sea*_*ira 20

最简单的方法(我知道)是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 ...
)
Run Code Online (Sandbox Code Playgroud)

  • 来自setuptools的find_packages()基本上完全相同,请参阅我的回答 (7认同)

Shu*_*ary 19

与dm76的答案相同,只是我的回购中也有测试,所以我使用:

from setuptools import find_packages

packages=find_packages(exclude=["*.tests", "*.tests.*", "tests.*", "tests"]),
Run Code Online (Sandbox Code Playgroud)