首先,我要说我在过去的一周里进行了广泛的研究,但仍没有找到这些问题的实际答案 - 只有一些模糊的答案,不能真正解释发生了什么。如果这只是因为我错过了我正在寻找的东西,我很抱歉 - 请直接指出正确的方向。
我的目录结构如下:
TestProject/
runtest*
testpackage/
__init__.py
testmod.py
testmod2.py
testsubs/
testsubmod.py
一些注意事项:
- 我使用的是Ubuntu上的python2.7 - 我正在使用bpython进行测试 - 我从特定目录运行bpython以测试导入的方式 - 我试图遵循最佳实践。 - 此软件包未安装,而是在随机的开发目录中 - 此目录不在pythonpath中 - 我在软件包目录中只有一个init.py - 嵌套目录中没有init.py文件 - init.py文件为空 - testpackage/testmod.py包含TestModClass - testpackage/testsubs/testsubmod.py包含TestSubModClass
我观察到的事情:
- 当我从TestProject/运行bpython时,import testpackage可以工作 - 这不会导入testpackage.testmod - 我无法访问testpackage.testmod - 当我从TestProject/运行bpython时,import testpackage.testmod失败 - 当我从TestProject/运行bpython时,from testpackage import testmod可以工作 - 我可以向init.py添加代码以显式导入testmod.py,但不能导入testsubs/testmod.py - 我认为这不是正确的方法,如果用户不想导入该模块怎么办?
- 从testmod.py中,我可以导入testmod2,但无法导入testpackage.testmod2 - 这很好做,这样我就可以用与STL或twisted重叠的名称(例如testpackage.logging)命名自己的模块,而不会导致错误(必须将自己的模块命名为customerlogging,而不仅仅是mypackage.logging)
问题:
- Python在处理存在于pythonpath中的包和模块时是否与从当前目录导入有所不同? - 为什么import testpackage不能让我访问testpackage.testmod?当我导入os时,我可以访问os.path等。 - 对于一个包,我应该坚持在基本目录中使用单个init.py,还是应该将它们嵌套在后续目录中? - 如何导入指定包名称的模块?例如,从testmod.py中,我想导入testpackage.testmod2而不仅仅是testmod2。 - 导入子模块的正确方法是什么?
- 我看到的唯一解决方案是从init.py将该目录附加到pythonpath中,但我不知道这是否是正确的方法。
提前感谢您。
__init__.py
,它是一个子包。__init__.py
这样说。