python中的包内模块加载

2024-06-26 17:53:35 发布

您现在位置:Python中文网/ 问答频道 /正文

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

从钢骨包1导入mod1\U 1

或者

进口钢骨包1.模式1

两者都不起作用。我在这里读了一些类似问题的答案,但找不到答案。在

编辑:我更改了模块名以遵循Python的命名约定。但我还是不能让这个简单的例子起作用。在


Tags: 模块pypackagesourceforinittoptests
2条回答

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

from top.src.pkg1 import mod1_1

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

为了让Python程序使用包,必须通过import语句找到该包。换句话说,包必须是位于的目录的子目录搜索路径. […]确保包已打开的最简单方法系统路径要么安装在标准库中,要么让用户扩展系统路径通过设置$PYTHONPATH shell环境变量“

在PYTHONPATH中添加到“top”的路径解决了问题。到使解决方案可移植(这是一个个人项目,但我需要在多台计算机上共享),我想在顶部有一个最小的初始化代码/设置.py应该行得通。在

相关问题 更多 >