为什么我需要在 setup.py 中包含子包
Why do I need to include sub-packages in setup.py
我有一个名为 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"
时,我现在收到如下错误:
File "/usr/local/lib/python2.7/dist-packages/mltester/__init__.py", line 1, in <module>
import actions
ImportError: No module named actions
而且我不明白为什么只列出包含 mltester
的包是不够的。当然,我可以简单地将包添加回去,但现在我认为我在这里遗漏了一些更概念化的东西。
因为packages
不要在子树中进行任何包查找。将包添加到 packages
将仅包括包本身和所有直接子模块,但 none 的子包。
例如,如果您有一个源代码树,包 spam
包含模块 eggs
和子包 bacon
:
src
└── spam
├── __init__.py
├── eggs.py
└── bacon
└── __init__.py
指定 packages=['spam']
将仅包括 spam
和 spam.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(),
...
)
我有一个名为 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"
时,我现在收到如下错误:
File "/usr/local/lib/python2.7/dist-packages/mltester/__init__.py", line 1, in <module>
import actions
ImportError: No module named actions
而且我不明白为什么只列出包含 mltester
的包是不够的。当然,我可以简单地将包添加回去,但现在我认为我在这里遗漏了一些更概念化的东西。
因为packages
不要在子树中进行任何包查找。将包添加到 packages
将仅包括包本身和所有直接子模块,但 none 的子包。
例如,如果您有一个源代码树,包 spam
包含模块 eggs
和子包 bacon
:
src
└── spam
├── __init__.py
├── eggs.py
└── bacon
└── __init__.py
指定 packages=['spam']
将仅包括 spam
和 spam.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(),
...
)