【问题标题】:Intrapackage module loads in python在python中加载包内模块
【发布时间】:2012-02-16 02:22:43
【问题描述】:

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

【问题讨论】:

  • 这给了我一个破折号上的语法错误。

标签: python pythonpath


【解决方案1】:

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

from top.src.pkg1 import mod1_1

【讨论】:

  • 我更改了名称以遵循约定,但您建议的语法仍然出现相同的错误
  • 你的 PYTHONPATH 中有 top 文件夹吗?
【解决方案2】:

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

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

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

【讨论】:

  • 链接现在失效了
猜你喜欢
  • 2013-09-07
  • 2013-04-18
  • 2015-07-21
  • 2018-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-25
  • 1970-01-01
相关资源
最近更新 更多