内包装模块在python中加载

时间:2012-02-16 02:22:43

标签: python pythonpath

我刚开始使用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的命名约定。但我仍然无法让这个简单的例子起作用。

2 个答案:

答案 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应该可以工作。