我刚开始使用python,并且无法理解包内模块加载的搜索路径。我有这样的结构:
top/ Top-level package
__init__.py Initialize the top package
src/ Subpackage for source files
__init__.py
pkg1/ Source subpackage 1
__init__.py
mod1_1.py
mod1_2.py
...
pkg2/ Source subpackage 2
__init__.py
mod2_1.py
mod2_2.py
...
...
test/ Subpackage for unit testing
__init__.py
pkg1Test/ Tests for subpackage1
__init__.py
testSuite1_1.py
testSuite1_2.py
...
pkg2Test/ Tests for subpackage2
__init__.py
testSuite2_1.py
testSuite2_2.py
...
...
在testSuite1_1中我需要导入模块mod1_1.py(依此类推)。我应该使用什么进口声明? Python的官方教程(在docs.python.org,第6.4.2节)说:
“如果在当前包中找不到导入的模块(当前模块是子模块的包),import语句将查找具有给定名称的顶级模块。”
我认为这意味着我可以使用(来自testSuite1_1.py):
来自src.pkg1 import mod1_1
或
导入src.pkg1.mod1_1
既不起作用。我在这里读了几个类似问题的答案,但找不到解决方案。
编辑:我更改了模块名称以遵循Python的命名约定。但我仍然无法让这个简单的例子起作用。
答案 0 :(得分:2)
模块名称不包含.py
扩展名。此外,在您的示例中,顶级模块实际上名为top
。最后,连字符对于python中的名称不合法,我建议用下划线替换它们。然后尝试:
from top.src.pkg1 import mod1_1
答案 1 :(得分:0)
在http://legacy.python.org/doc/essays/packages.html的帮助下解决了问题(在类似的问题中提到)。关键点(对于更有经验的python开发人员而言显而易见)是:
“为了让Python程序使用一个包,必须通过import语句找到该包。换句话说,该包必须是sys.path上的目录的子目录。[...]确保软件包在sys.path上的最简单方法是将其安装在标准库中,或者让用户通过设置$ PYTHONPATH shell环境变量来扩展sys.path“
向PYTHONPATH添加“top”路径解决了这个问题。为了使解决方案可移植(这是一个个人项目,但我需要在多台机器上共享它),我想顶部/设置中有一个最小的初始化代码.py应该可以工作。