我有一个称为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
仅包括软件包本身和所有直接的子模型,但没有一个子弹。
例如,如果您的源树带有包含模块eggs
和Subpakage bacon
的软件包spam
:
src
└── spam
├── __init__.py
├── eggs.py
└── bacon
└── __init__.py
指定packages=['spam']
仅包括spam
和spam.eggs
,但不包括spam.bacon
,因此不会安装spam.bacon
。您必须单独添加它以包括完整的源代码库:packages=['spam', 'spam.bacon']
。
为了自动化packages
列表的构建,setuptools
提供了方便的功能find_packages
:
from setuptools import find_packages, setup
setup(
packages=find_packages(),
...
)