好的,让我们举个例子(下面的原始问题)。
我制作了一个名为“myproject”的包,它显示了我面临的问题。
- 在此处下载包:https ://dl.dropbox.com/u/11013311/myproject.zip
- 安装包(例如:sudo python setup.py develop)
- 打开一个 Ipython 会话并输入:“import myproject”
- 如果您开始输入“myproject”。并点击两次选项卡以获取可用的方法/值...,您会看到“myproject.myproject”,它自己也显示出同样的问题。
你们中的一个人能够解释我做错了什么吗?Andrew Alcock的回答并不能帮助我解决这个问题,或者至少我看不出问题出在哪里。
当然,通过这样一个简单的示例,包__init__.py
文件不需要那么复杂,但是在我的实际项目中,我确实需要COOL
通过myproject.COOL
.
感谢您的回答!
编辑:我奖励了utapyngo赏金,因为他的解决方案是有效的,而且我学到了更多东西(具有深度子模块的相对导入)。但我要感谢Andrew和nehz的回答(nehz还提供了解决我的问题的解决方案,但主观上我觉得它“不那么漂亮”;Andrew提供了有用的建议)。可惜我不能分享赏金。
**
原始问题:
**
我不确定我是否正确地表达了这个问题。我创建了一个包含许多子包的大型代码,为简单起见,我们将其称为“代码”。
问题是: 'CODE' 出现在命名空间中,所以我可以拥有CODE.CODE
orCODE.CODE.CODE
等...无限次,这对我来说看起来很奇怪,并且可能(我猜)暗示有问题(尽管代码运行良好没有警告)。
我猜这个问题与我__init__.py
和我的代码结构有关,所以我在这里提供更多信息。
简化的代码结构:
CODE
| __init__.py
| tools
| __init__.py
| mytools.py
| other
| __init__.py
| init.py
| sub
| __init__.py
| module.py
文件:(__init__.py
第一个,在根目录CODE
)
import CODE.tools.mytools as MyTools
import CODE.other.init
OBJ = CODE.other.init.function()
...
该文件mytools.py
不OBJ
从 CODE 或任何其他可能导入的模块导入OBJ
。
init.py
可以导入模块,例如mytools.py
. 最后,类似的模块module.py
可以导入mytools.py
或OBJ
(从 CODE)。通常,所有导入都是使用绝对导入进行的,例如 in: from CODE.sub.module import func
。
有人对这种行为有解释吗?我没有找到关于 SO 的任何相关问题,但这可能是由于我的措辞错误。