2017-03-20 71 views
0

导入模块我有一个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 

不过,我得到一个导入错误,因为这将尝试从合奏目录中导入verification.py模块,而不是最高级别图书馆。

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

from ..verification import obs 

,但我得到这个错误:

ValueError: Attempted relative import beyond toplevel package 

如何定位python_lib/verification.pypython_lib/ensemble/*.py进口,但不尝试导入本地包版本?

我正在使用Python版本2.7。

+3

'from python_lib.verification import obs'? – leovp

+0

@leovp python_lib不是包,它只发生在源代码所在的基目录中。 – ccbunney

+0

尝试添加名为__init__.py的每个子目录空文件。 看看这个https://stackoverflow.com/questions/11536764/how-to-fix-attempted-relative-import-in-non-package-even-with-init-py?rq=1也 – nivhanin

回答

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)

1
  1. 您的所有目录应该包含文件__init__.py,否则将不被认定为包。

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

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

像这样:

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

之后做到这一点,这应该工作:

from ..verification import obs 
0

有迹象表明,有在创建包和模块应遵循的一些规则。

  1. 确保文件是__init__.py作为您的软件包的一部分。每个python软件包都应该有这个文件
  2. 模块看起来有三种方式。

一个很好的文档可Module-search-path

通常在建设项目它的一个练习,创建一个lib包,并添加基于不同类别的子目录,并添加主目录PYTHONPATH变量。这使得该模块可用于其他程序。