2

我刚开始使用 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 节)说:

“如果在当前包(当前模块是其子模块的包)中找不到导入的模块,则导入语句会查找具有给定名称的顶级模块。”

我认为这意味着我可以使用(在 testSuite1_1.py 中):

从 src.pkg1 导入 mod1_1

或者

导入 src.pkg1.mod1_1

两者都不起作用。我在这里阅读了类似问题的几个答案,但找不到解决方案。

编辑:我更改了模块名称以遵循 Python 的命名约定。但我仍然无法让这个简单的例子工作。

4

2 回答 2

2

模块名称不包括.py扩展名。此外,在您的示例中,顶级模块实际上名为top. 最后,连字符对于 python 中的名称是不合法的,我建议用下划线替换它们。然后尝试:

from top.src.pkg1 import mod1_1
于 2012-02-16T02:51:21.323 回答
0

在http://legacy.python.org/doc/essays/packages.html的帮助下解决了问题(在类似问题中提到)。关键点(对于更有经验的 python 开发人员来说可能很明显)是:

“为了让 Python 程序使用包,包必须可以通过 import 语句找到。换句话说,包必须是 sys.path 上目录的子目录。[...] 最简单的方法要确保软件包在 sys.path 上,要么将其安装在标准库中,要么让用户通过设置他们的 $PYTHONPATH shell 环境变量来扩展 sys.path”

将“top”的路径添加到 PYTHONPATH 解决了这个问题。为了使解决方案可移植(这是一个个人项目,但我需要在多台机器上共享它),我想在 top/setup.py 中应该有一个最小的初始化代码工作。

于 2012-02-16T21:33:03.073 回答