为什么在setup.py中需要包含子包?

15

我有一个名为mltester的Python包,其中包含两个子包(actions, dialogs)和一个主脚本ml_tester.py,其结构如下:

+ <ProjectFolder>
+---+ <mltester>
|   +---- <actions>
|   +---- <dialogs>
|   +---- ml_tester.py
|   +---- __init__.py
+---- setup.py

我的__init__.py文件如下:

import actions
import dialogs
import ml_tester
ml_tester.py 中,我会做一些类似这样的事情:
from actions import *
from dialogs import *

在从Eclipse运行时一切都正常。当执行pip install时,以下setup.py可以正常工作:

from setuptools import setup
setup(
    name="MLTester",
    version="1.0",
    packages=["mltester",
              "mltester.actions",
              "mltester.dialogs"],
    install_requires=[
        "matplotlib",
    ],
    entry_points='''
        [console_scripts]
        ml_tester_gui=mltester.ml_tester:main
    '''
)

但是当我从包列表中删除"mltester.actions""mltester.dialogs"后,现在会出现以下错误:

但是当我从包列表中移除"mltester.actions""mltester.dialogs"后,现在我收到一个类似这样的错误:

File "/usr/local/lib/python2.7/dist-packages/mltester/__init__.py", line 1, in <module>
    import actions
ImportError: No module named actions

我不明白为什么只列出包含mltester包还不够。当然,我可以简单地将这些包添加回去,但现在我认为我错过了更多概念上的东西。

1个回答

20

由于 packages 在子树中不进行任何包查找。向 packages 添加一个包将仅包括该包本身和所有直接子模块,而不包括任何子包。

例如,如果您有一个包含模块 eggs 和子包 bacon 的软件包 spam 的源代码树:

src
└── spam
    ├── __init__.py
    ├── eggs.py
    └── bacon
        └── __init__.py

指定 packages=['spam'] 将只包含 spamspam.eggs,但不包含 spam.bacon,因此不会安装 spam.bacon。您需要单独添加它以包含完整的源代码库: packages=['spam', 'spam.bacon']

为了自动化构建 packages 列表,setuptools 提供了一个方便的函数 find_packages使用 find_packages

from setuptools import find_packages, setup

setup(
    packages=find_packages(),
    ...
)

1
请注意,find_packages()通常会选择测试文件,这通常不是您想要的。 - shuckc
@shuckc,find_packages 中的 exclude 参数就是用来排除特定包的。 - hoefling

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接