python中导入模块的模糊性

2024-09-30 08:26:31 发布

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

我有一个如下所示的Python库(包含包):

|-- python_lib/
    |-- plotting.py
    |-- verification.py
    |-- io.py
    |
    |-- ensemble/
        | -- plotting.py
        | -- verification.py

但是,我遇到了模棱两可的模块导入问题。在ensemble.plotting.py中,我想从顶层导入verification.py模块(python_lib):

^{pr2}$

但是,我得到一个导入错误,因为它试图从Ensement目录而不是库的顶层导入verification.py模块。在

我认为“abslute imports”功能可以解决这个问题:

from ..verification import obs

但我得到一个错误:

ValueError: Attempted relative import beyond toplevel package

如何将python_lib/verification.py作为从python_lib/ensemble/*.py的导入而不尝试导入本地包版本?在

我使用的是python2.7版本。在


Tags: 模块pyioimport版本目录lib错误
3条回答
  1. 所有目录都应该包含文件__init__.py,否则它们将不会被识别为包。

  2. 您的目录python_lib必须是已知路径。您在一篇评论中说您的PYTHONPATH包含一个python_lib的路径,所以这看起来不错。

  3. 如果您以python_lib/ensemble/verification.py作为主入口点,那么目录python_lib/ensemble会隐藏您的目录{},并且您必须手动告诉Python您的脚本属于该包。

像这样:

 if __name__ == "__main__" and __package__ is None:
     __package__ = "pythonlib.ensemble"
     import pythonlib

完成后,这将起作用:

^{pr2}$

创建包和模块时必须遵循一些规则。在

  1. 确保包中有__init__.py文件。每个python包都应该有这个文件
  2. 当模块被查看时,它以3种方式发生。

很好的文档是可用的Module-search-path

通常在构建项目时,通常会创建一个lib包并根据不同的类别添加子目录,然后将主目录添加到PYTHONPATH变量中。这使得该模块可用于其他程序。在

这是一个老套的解决方案,可以工作,但通常是不鼓励的。在

当必须忽略冲突时,可以就地修改python路径。像这样:

import sys  # needed to make it work

tmp = sys.path[0]
sys.path = sys.path[1:]  # ugly and hacky thingy

# import stuff you need (would work with __init__.py in a base dir)
from python_lib import verification
from ..verification.obs import obs

# fix path back
sys.path.insert(0, tmp)

我刚刚测试了这个模式,它似乎可以工作(python3.6.0)

相关问题 更多 >

    热门问题