python

时间:2017-03-20 13:06:29

标签: python python-2.7 python-import

我有一个看起来像这样的Python库(包含包):

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

但是,我遇到模糊模块导入问题。在ensemble.plotting.py我想从顶层(verification.py)导入python_lib模块:

# ensemble/plotting.py
import verification.obs as verobs

但是,我收到导入错误,因为它尝试从ensemble目录导入verification.py模块,而不是从库的顶层导入。

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

from ..verification import obs

但是我收到了这个错误:

ValueError: Attempted relative import beyond toplevel package

如何在不尝试导入本地软件包版本的情况下将python_lib/verification.py作为python_lib/ensemble/*.py导入进行定位?

我使用的是Python 2.7版。

3 个答案:

答案 0 :(得分:1)

  1. 您的所有目录都应包含__init__.py个文件,否则它们不会被识别为包。

  2. 您的目录python_lib必须是已知路径。您在评论中说,PYTHONPATH包含python_lib的路径,因此看起来不错。

  3. 如果你从例如python_lib/ensemble/verification.py作为主要入口点,然后目录python_lib/ensemble会影响您的目录python_lib,您必须手动告诉Python您的脚本属于该程序包。

  4. 像这样:

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

    完成后,这应该有效:

    from ..verification import obs
    

答案 1 :(得分:0)

这是一个可行的 hacky 解决方案,但通常不鼓励。

当您必须省略冲突时,可以修改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)

我刚刚测试了这个模式,它似乎可以工作(Python 3.6.0)

答案 2 :(得分:0)

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

  1. 确保将__init__.py文件作为您的包的一部分。每个python包都应该有这个文件
  2. 虽然模块看起来有三种方式。
  3. 提供了非常好的文档Module-search-path

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