为什么我需要在setup.py中包含子软件包

Ela*_*iss 5 python setup.py

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

+ <ProjectFolder>
+---+ <mltester>
|   +---- <actions>
|   +---- <dialogs>
|   +---- ml_tester.py
|   +---- __init__.py
+---- setup.py
Run Code Online (Sandbox Code Playgroud)

我的__init__.py样子如下:

import actions
import dialogs
import ml_tester
Run Code Online (Sandbox Code Playgroud)

ml_tester.py我做类似的事情:

from actions import *
from dialogs import *
Run Code Online (Sandbox Code Playgroud)

从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
    '''
)
Run Code Online (Sandbox Code Playgroud)

但是,当我从软件包列表中删除时"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
Run Code Online (Sandbox Code Playgroud)

而且我不明白为什么仅列出包含的mltester软件包是不够的。当然,我可以简单地将软件包添加回去,但是现在我认为这里缺少一些更具概念性的内容。

hoe*_*ing 8

因为packages在子树中不执行任何程序包查找。向中添加软件包packages将仅包括软件包本身和所有直接子模块,而没有子软件包。

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

src
??? spam
    ??? __init__.py
    ??? eggs.py
    ??? bacon
        ??? __init__.py
Run Code Online (Sandbox Code Playgroud)

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

为了自动构建packages列表,setuptools 提供了一个方便的功能find_packages

from setuptools import find_packages, setup

setup(
    packages=find_packages(),
    ...
)
Run Code Online (Sandbox Code Playgroud)