【问题标题】:Why do I need to include sub-packages in setup.py为什么我需要在 setup.py 中包含子包
【发布时间】:2018-10-09 13:08:48
【问题描述】:

我有一个名为mltester 的python 包,其中包含两个子包(actionsdialogs)和一个主脚本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" 时,我现在收到如下错误:

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

而且我不明白为什么只列出包含 mltester 的包是不够的。当然,我可以简单地将包添加回来,但现在我认为我在这里遗漏了一些更概念性的东西。

【问题讨论】:

    标签: python setuptools setup.py


    【解决方案1】:

    因为packages 不会在子树中进行任何包查找。将包添加到packages 将只包括包本身和所有直接子模块,而不包括任何子包。

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

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

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

    要自动构建packages 列表,setuptools offers a handy function find_packages

    from setuptools import find_packages, setup
    
    setup(
        packages=find_packages(),
        ...
    )
    

    【讨论】:

    • 请注意,find_packages() 通常会选择您不想要的测试。
    • @shuckc 这就是find_packages 中的exclude 参数的用途。
    猜你喜欢
    • 2021-06-25
    • 2021-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多